@ai-sdk/openai-compatible 3.0.80 → 3.0.82
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 +31 -0
- package/dist/index.d.ts +17 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -17
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +12 -2
- package/dist/internal/index.d.ts.map +1 -1
- package/docs/index.mdx +5 -1
- package/package.json +3 -3
- package/src/chat/openai-compatible-chat-language-model.ts +30 -4
- package/src/completion/openai-compatible-completion-language-model.ts +11 -3
- package/src/embedding/openai-compatible-embedding-model.ts +4 -2
- package/src/image/openai-compatible-image-model.ts +14 -6
- package/src/openai-compatible-provider.ts +13 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @ai-sdk/openai-compatible
|
|
2
2
|
|
|
3
|
+
## 3.0.82
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7716e18: Support promises and synchronous or asynchronous callbacks in provider API key and token settings. Resolve credentials per authenticated request while preserving existing authentication behavior and synchronous credential serialization.
|
|
8
|
+
|
|
9
|
+
The experimental OpenAI Live `getServerWebSocketConfig()` method can now resolve asynchronously. Await its result before using the connection settings.
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [7716e18]
|
|
12
|
+
- Updated dependencies [5c247e9]
|
|
13
|
+
- Updated dependencies [dcd2f8d]
|
|
14
|
+
- @ai-sdk/provider-utils@5.0.72
|
|
15
|
+
- @ai-sdk/provider@4.0.35
|
|
16
|
+
|
|
17
|
+
## 3.0.81
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- 61a315e: fix: map the top-level `reasoning` option consistently across providers
|
|
22
|
+
|
|
23
|
+
Providers now resolve reasoning the same way:
|
|
24
|
+
|
|
25
|
+
1. A provider-specific reasoning setting in `providerOptions` is sent unchanged. OpenAI no longer drops `providerOptions.openai.reasoningEffort` values that are not in its list for the model, and Fireworks no longer rewrites `providerOptions.fireworks.reasoningEffort`. Fireworks also sends top-level `reasoning` values directly instead of rounding them to `'high'` at most, except for model families known to reject `'none'` (GPT-OSS, GLM-5.3, Muse Spark) or `'minimal'` (Nemotron, Inkling).
|
|
26
|
+
2. Otherwise, `reasoning` maps to the closest level the model supports, rounding down, and rounds up only when there is no lower level. For example, `'xhigh'` now maps to `'high'` instead of `'max'` on Anthropic and Bedrock models without `xhigh` effort, and `'medium'` maps to `'low'` instead of `'high'` on DeepSeek, Kimi K3, and Mistral GLM-5.3 models.
|
|
27
|
+
3. `'none'` on a model that cannot disable reasoning maps to the model's lowest level with a compatibility warning, instead of being dropped or sending a request the API rejects. This affects GPT-6 models without `'none'`, xAI grok-4.5 and later, Groq GPT-OSS, Kimi K3, Perplexity, QuiverAI, Bedrock OpenAI `gpt-oss` models, and Gemini 2.5 Pro (minimum thinking budget). Gemini 3 and Anthropic and Bedrock `between_tools` mappings now emit the compatibility warning too.
|
|
28
|
+
|
|
29
|
+
`mapReasoningToProviderEffort` now accepts any `reasoning` value, returns an optional `providerOptionsEffort` unchanged, and rounds levels that are missing from the effort map to the closest supported level. `mapReasoningToProviderBudget` maps `'none'` to the minimum reasoning budget, always returns a budget, and uses the default percentage for levels missing from `budgetPercentages`. `OpenAICompatibleChatConfig` adds an optional `mapReasoning` function for mapping the top-level `reasoning` option.
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [61a315e]
|
|
32
|
+
- @ai-sdk/provider-utils@5.0.71
|
|
33
|
+
|
|
3
34
|
## 3.0.80
|
|
4
35
|
|
|
5
36
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EmbeddingModelV4, ImageModelV4, LanguageModelV4, LanguageModelV4CallOptions, LanguageModelV4GenerateResult, LanguageModelV4StreamResult, LanguageModelV4Usage, ProviderV4, SharedV4ProviderMetadata, SharedV4Warning } from "@ai-sdk/provider";
|
|
2
|
-
import { FetchFunction, InferSchema, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@ai-sdk/provider-utils";
|
|
2
|
+
import { FetchFunction, InferSchema, Resolvable, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@ai-sdk/provider-utils";
|
|
3
3
|
import { ZodType, z } from "zod/v4";
|
|
4
4
|
//#region src/openai-compatible-error.d.ts
|
|
5
5
|
declare const openaiCompatibleErrorDataSchema: z.ZodObject<{
|
|
@@ -74,7 +74,7 @@ type MetadataExtractor = {
|
|
|
74
74
|
//#region src/chat/openai-compatible-chat-language-model.d.ts
|
|
75
75
|
type OpenAICompatibleChatConfig = {
|
|
76
76
|
provider: string;
|
|
77
|
-
headers?:
|
|
77
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
78
78
|
url: (options: {
|
|
79
79
|
modelId: string;
|
|
80
80
|
path: string;
|
|
@@ -102,6 +102,16 @@ type OpenAICompatibleChatConfig = {
|
|
|
102
102
|
* The optional warnings array can be used to report request transformations.
|
|
103
103
|
*/
|
|
104
104
|
transformRequestBody?: (args: Record<string, any>, warnings?: SharedV4Warning[]) => Record<string, any>;
|
|
105
|
+
/**
|
|
106
|
+
* Optional function to map the top-level `reasoning` option to the
|
|
107
|
+
* `reasoning_effort` request value. It is not applied to a `reasoningEffort`
|
|
108
|
+
* from provider options, which is always sent unchanged. By default, the
|
|
109
|
+
* reasoning value is sent directly.
|
|
110
|
+
*/
|
|
111
|
+
mapReasoning?: (options: {
|
|
112
|
+
reasoning: Exclude<LanguageModelV4CallOptions['reasoning'], 'provider-default' | undefined>;
|
|
113
|
+
warnings: SharedV4Warning[];
|
|
114
|
+
}) => string | undefined;
|
|
105
115
|
/**
|
|
106
116
|
* Optional usage converter for OpenAI-compatible providers with different
|
|
107
117
|
* token accounting semantics.
|
|
@@ -161,7 +171,7 @@ type OpenAICompatibleLanguageModelCompletionOptions = InferSchema<typeof openaiC
|
|
|
161
171
|
type OpenAICompatibleCompletionConfig = {
|
|
162
172
|
provider: string;
|
|
163
173
|
includeUsage?: boolean;
|
|
164
|
-
headers?:
|
|
174
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
165
175
|
url: (options: {
|
|
166
176
|
modelId: string;
|
|
167
177
|
path: string;
|
|
@@ -219,7 +229,7 @@ type OpenAICompatibleEmbeddingConfig = {
|
|
|
219
229
|
modelId: string;
|
|
220
230
|
path: string;
|
|
221
231
|
}) => string;
|
|
222
|
-
headers?:
|
|
232
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
223
233
|
fetch?: FetchFunction;
|
|
224
234
|
errorStructure?: ProviderErrorStructure<any>;
|
|
225
235
|
};
|
|
@@ -249,7 +259,7 @@ type OpenAICompatibleImageModelId = string;
|
|
|
249
259
|
//#region src/image/openai-compatible-image-model.d.ts
|
|
250
260
|
type OpenAICompatibleImageModelConfig = {
|
|
251
261
|
provider: string;
|
|
252
|
-
headers?:
|
|
262
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
253
263
|
url: (options: {
|
|
254
264
|
modelId: string;
|
|
255
265
|
path: string;
|
|
@@ -328,8 +338,9 @@ interface OpenAICompatibleProviderSettings {
|
|
|
328
338
|
* API key for authenticating requests. If specified, adds an `Authorization`
|
|
329
339
|
* header to request headers with the value `Bearer <apiKey>`. This will be added
|
|
330
340
|
* before any headers potentially specified in the `headers` option.
|
|
341
|
+
* A function is called before each request and may return a promise.
|
|
331
342
|
*/
|
|
332
|
-
apiKey?: string
|
|
343
|
+
apiKey?: Resolvable<string>;
|
|
333
344
|
/**
|
|
334
345
|
* Optional custom headers to include in requests. These will be added to request headers
|
|
335
346
|
* after any headers potentially added by use of the `apiKey` option.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/openai-compatible-error.ts","../src/chat/openai-compatible-chat-language-model-options.ts","../src/chat/openai-compatible-metadata-extractor.ts","../src/chat/openai-compatible-chat-language-model.ts","../src/completion/openai-compatible-completion-language-model-options.ts","../src/completion/openai-compatible-completion-language-model.ts","../src/embedding/openai-compatible-embedding-model-options.ts","../src/embedding/openai-compatible-embedding-model.ts","../src/image/openai-compatible-image-settings.ts","../src/image/openai-compatible-image-model.ts","../src/image/openai-compatible-image-model-options.ts","../src/openai-compatible-provider.ts","../src/version.ts"],"mappings":";;;;cACa,iCAA+B,EAAA;;;;;;;GAW1C,EAAA,KAAA;KAEU,4BAA4B,EAAE,aACjC;KAGG,uBAAuB;EACjC,aAAa,QAAQ;EACrB,iBAAiB,OAAO;EACxB,eAAe,UAAU,UAAU,QAAQ;;;;KCnBjC;cAEC,0CAAwC,EAAA;;;;;GAyBnD,EAAA,KAAA;KAEU,2CAA2C,EAAE,aAChD;;;;;;;;KCzBG;;;;;;;;;EASV,oBACE;IAEA;QACI,QAAQ;;;;;;;;EASd;;;;;;;IAOE,aAAa;;;;;;;;IASb,iBAAiB;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/openai-compatible-error.ts","../src/chat/openai-compatible-chat-language-model-options.ts","../src/chat/openai-compatible-metadata-extractor.ts","../src/chat/openai-compatible-chat-language-model.ts","../src/completion/openai-compatible-completion-language-model-options.ts","../src/completion/openai-compatible-completion-language-model.ts","../src/embedding/openai-compatible-embedding-model-options.ts","../src/embedding/openai-compatible-embedding-model.ts","../src/image/openai-compatible-image-settings.ts","../src/image/openai-compatible-image-model.ts","../src/image/openai-compatible-image-model-options.ts","../src/openai-compatible-provider.ts","../src/version.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InvalidPromptError, InvalidResponseDataError, TooManyEmbeddingValuesForCallError, UnsupportedFunctionalityError } from "@ai-sdk/provider";
|
|
2
|
-
import { StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertBase64ToUint8Array, convertToBase64, convertToFormData, createBinaryResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createStatusCodeErrorResponseHandler, downloadBlob, generateId, getFromApi, getTopLevelMediaType, isCustomReasoning, lazySchema, parseProviderOptions, postFormDataToApi, postJsonToApi, resolveFullMediaType, resolveProviderReference, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
|
|
2
|
+
import { StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertBase64ToUint8Array, convertToBase64, convertToFormData, createBinaryResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createStatusCodeErrorResponseHandler, downloadBlob, generateId, getFromApi, getTopLevelMediaType, isCustomReasoning, lazySchema, parseProviderOptions, postFormDataToApi, postJsonToApi, resolve, resolveFullMediaType, resolveProviderReference, resolveWith, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
|
|
3
3
|
import { z } from "zod/v4";
|
|
4
4
|
//#region src/utils/to-camel-case.ts
|
|
5
5
|
function toCamelCase(str) {
|
|
@@ -442,7 +442,10 @@ var OpenAICompatibleChatLanguageModel = class OpenAICompatibleChatLanguageModel
|
|
|
442
442
|
...providerOptions?.[this.providerOptionsName],
|
|
443
443
|
...providerOptions?.[toCamelCase(this.providerOptionsName)]
|
|
444
444
|
}).filter(([key]) => !Object.keys(openaiCompatibleLanguageModelChatOptions.shape).includes(key))),
|
|
445
|
-
reasoning_effort: compatibleOptions.reasoningEffort ?? (isCustomReasoning(reasoning) ?
|
|
445
|
+
reasoning_effort: compatibleOptions.reasoningEffort ?? (isCustomReasoning(reasoning) ? this.config.mapReasoning != null ? this.config.mapReasoning({
|
|
446
|
+
reasoning,
|
|
447
|
+
warnings
|
|
448
|
+
}) : reasoning : void 0),
|
|
446
449
|
verbosity: compatibleOptions.textVerbosity,
|
|
447
450
|
messages: convertToOpenAICompatibleChatMessages(prompt, {
|
|
448
451
|
provider: this.providerOptionsName,
|
|
@@ -464,7 +467,7 @@ var OpenAICompatibleChatLanguageModel = class OpenAICompatibleChatLanguageModel
|
|
|
464
467
|
path: "/chat/completions",
|
|
465
468
|
modelId: this.modelId
|
|
466
469
|
}),
|
|
467
|
-
headers: combineHeaders(this.config.headers
|
|
470
|
+
headers: combineHeaders(await resolve(this.config.headers), options.headers),
|
|
468
471
|
body: transformedBody,
|
|
469
472
|
failedResponseHandler: this.failedResponseHandler,
|
|
470
473
|
successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),
|
|
@@ -530,7 +533,7 @@ var OpenAICompatibleChatLanguageModel = class OpenAICompatibleChatLanguageModel
|
|
|
530
533
|
path: "/chat/completions",
|
|
531
534
|
modelId: this.modelId
|
|
532
535
|
}),
|
|
533
|
-
headers: combineHeaders(this.config.headers
|
|
536
|
+
headers: combineHeaders(await resolve(this.config.headers), options.headers),
|
|
534
537
|
body,
|
|
535
538
|
failedResponseHandler: this.failedResponseHandler,
|
|
536
539
|
successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),
|
|
@@ -1022,7 +1025,7 @@ var OpenAICompatibleCompletionLanguageModel = class OpenAICompatibleCompletionLa
|
|
|
1022
1025
|
path: "/completions",
|
|
1023
1026
|
modelId: this.modelId
|
|
1024
1027
|
}),
|
|
1025
|
-
headers: combineHeaders(this.config.headers
|
|
1028
|
+
headers: combineHeaders(await resolve(this.config.headers), options.headers),
|
|
1026
1029
|
body: args,
|
|
1027
1030
|
failedResponseHandler: this.failedResponseHandler,
|
|
1028
1031
|
successfulResponseHandler: createJsonResponseHandler(openaiCompatibleCompletionResponseSchema),
|
|
@@ -1063,7 +1066,7 @@ var OpenAICompatibleCompletionLanguageModel = class OpenAICompatibleCompletionLa
|
|
|
1063
1066
|
path: "/completions",
|
|
1064
1067
|
modelId: this.modelId
|
|
1065
1068
|
}),
|
|
1066
|
-
headers: combineHeaders(this.config.headers
|
|
1069
|
+
headers: combineHeaders(await resolve(this.config.headers), options.headers),
|
|
1067
1070
|
body,
|
|
1068
1071
|
failedResponseHandler: this.failedResponseHandler,
|
|
1069
1072
|
successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),
|
|
@@ -1258,7 +1261,7 @@ var OpenAICompatibleEmbeddingModel = class OpenAICompatibleEmbeddingModel {
|
|
|
1258
1261
|
path: "/embeddings",
|
|
1259
1262
|
modelId: this.modelId
|
|
1260
1263
|
}),
|
|
1261
|
-
headers: combineHeaders(this.config.headers
|
|
1264
|
+
headers: combineHeaders(await resolve(this.config.headers), headers),
|
|
1262
1265
|
body: {
|
|
1263
1266
|
model: this.modelId,
|
|
1264
1267
|
input: values,
|
|
@@ -1346,7 +1349,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
|
|
|
1346
1349
|
path: isEditing ? "/images/edits" : "/images/generations",
|
|
1347
1350
|
modelId: this.modelId
|
|
1348
1351
|
});
|
|
1349
|
-
const requestHeaders = combineHeaders(this.config.headers
|
|
1352
|
+
const requestHeaders = combineHeaders(await resolve(this.config.headers), headers);
|
|
1350
1353
|
if (isEditing) {
|
|
1351
1354
|
const { value: response, responseHeaders } = await postFormDataToApi({
|
|
1352
1355
|
url,
|
|
@@ -1368,7 +1371,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
|
|
|
1368
1371
|
return {
|
|
1369
1372
|
images: await this.getImages(response.data, {
|
|
1370
1373
|
url,
|
|
1371
|
-
headers
|
|
1374
|
+
headers,
|
|
1372
1375
|
abortSignal
|
|
1373
1376
|
}),
|
|
1374
1377
|
warnings,
|
|
@@ -1398,7 +1401,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
|
|
|
1398
1401
|
return {
|
|
1399
1402
|
images: await this.getImages(response.data, {
|
|
1400
1403
|
url,
|
|
1401
|
-
headers
|
|
1404
|
+
headers,
|
|
1402
1405
|
abortSignal
|
|
1403
1406
|
}),
|
|
1404
1407
|
warnings,
|
|
@@ -1423,7 +1426,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
|
|
|
1423
1426
|
validateUrl: true,
|
|
1424
1427
|
trustedOrigin: options.url,
|
|
1425
1428
|
credentialedOrigin: options.url,
|
|
1426
|
-
headers: options.headers,
|
|
1429
|
+
headers: combineHeaders(await resolve(this.config.headers), options.headers),
|
|
1427
1430
|
abortSignal: options.abortSignal,
|
|
1428
1431
|
fetch: this.config.fetch,
|
|
1429
1432
|
successfulResponseHandler: createBinaryResponseHandler(),
|
|
@@ -1458,7 +1461,7 @@ async function fileToBlob(file) {
|
|
|
1458
1461
|
}
|
|
1459
1462
|
//#endregion
|
|
1460
1463
|
//#region src/version.ts
|
|
1461
|
-
const VERSION = "3.0.
|
|
1464
|
+
const VERSION = "3.0.82";
|
|
1462
1465
|
//#endregion
|
|
1463
1466
|
//#region src/openai-compatible-provider.ts
|
|
1464
1467
|
/**
|
|
@@ -1467,11 +1470,12 @@ const VERSION = "3.0.80";
|
|
|
1467
1470
|
function createOpenAICompatible(options) {
|
|
1468
1471
|
const baseURL = withoutTrailingSlash(options.baseURL);
|
|
1469
1472
|
const providerName = options.name;
|
|
1470
|
-
const
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1473
|
+
const configuredApiKey = options.apiKey;
|
|
1474
|
+
const headers = { ...options.headers };
|
|
1475
|
+
const getHeaders = () => resolveWith(configuredApiKey, (apiKey) => withUserAgentSuffix({
|
|
1476
|
+
...apiKey && { Authorization: `Bearer ${apiKey}` },
|
|
1477
|
+
...headers
|
|
1478
|
+
}, `ai-sdk-openai-compatible/${VERSION}`));
|
|
1475
1479
|
const getCommonModelConfig = (modelType) => ({
|
|
1476
1480
|
provider: `${providerName}.${modelType}`,
|
|
1477
1481
|
url: ({ path }) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_exhaustiveCheck","getResponseMetadata","mapOpenAICompatibleFinishReason","_exhaustiveCheck","mapOpenAICompatibleFinishReason","getResponseMetadata","_exhaustiveCheck"],"sources":["../src/utils/to-camel-case.ts","../src/openai-compatible-error.ts","../src/chat/convert-openai-compatible-chat-usage.ts","../src/chat/convert-to-openai-compatible-chat-messages.ts","../src/chat/get-response-metadata.ts","../src/chat/map-openai-compatible-finish-reason.ts","../src/chat/openai-compatible-chat-language-model-options.ts","../src/chat/openai-compatible-prepare-tools.ts","../src/chat/openai-compatible-chat-language-model.ts","../src/completion/convert-openai-compatible-completion-usage.ts","../src/completion/convert-to-openai-compatible-completion-prompt.ts","../src/completion/map-openai-compatible-finish-reason.ts","../src/completion/openai-compatible-completion-language-model-options.ts","../src/completion/openai-compatible-completion-language-model.ts","../src/embedding/openai-compatible-embedding-model-options.ts","../src/embedding/openai-compatible-embedding-model.ts","../src/image/openai-compatible-image-model.ts","../src/version.ts","../src/openai-compatible-provider.ts"],"sourcesContent":["import type { SharedV4Warning } from '@ai-sdk/provider';\n\nexport function toCamelCase(str: string): string {\n return str.replace(/[_-]([a-z])/g, g => g[1].toUpperCase());\n}\n\n/**\nResolves which key to use for providerMetadata based on what the caller\npassed in providerOptions. Returns the camelCase variant when the caller\nsupplied it, otherwise falls back to the raw name.\n*/\nexport function resolveProviderOptionsKey(\n rawName: string,\n providerOptions: Record<string, unknown> | undefined,\n): string {\n const camelName = toCamelCase(rawName);\n if (camelName !== rawName && providerOptions?.[camelName] != null) {\n return camelName;\n }\n return rawName;\n}\n\n/**\nPushes a deprecation warning when the user supplies providerOptions under a non-camelCase key\n*/\nexport function warnIfDeprecatedProviderOptionsKey({\n rawName,\n providerOptions,\n warnings,\n}: {\n rawName: string;\n providerOptions: Record<string, unknown> | undefined;\n warnings: SharedV4Warning[];\n}): void {\n const camelName = toCamelCase(rawName);\n if (camelName !== rawName && providerOptions?.[rawName] != null) {\n warnings.push({\n type: 'deprecated',\n setting: `providerOptions key '${rawName}'`,\n message: `Use '${camelName}' instead.`,\n });\n }\n}\n","import { z, type ZodType } from 'zod/v4';\nexport const openaiCompatibleErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n\n // The additional information below is handled loosely to support\n // OpenAI-compatible providers that have slightly different error\n // responses:\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n});\n\nexport type OpenAICompatibleErrorData = z.infer<\n typeof openaiCompatibleErrorDataSchema\n>;\n\nexport type ProviderErrorStructure<T> = {\n errorSchema: ZodType<T>;\n errorToMessage: (error: T) => string;\n isRetryable?: (response: Response, error?: T) => boolean;\n};\n\nexport const defaultOpenAICompatibleErrorStructure: ProviderErrorStructure<OpenAICompatibleErrorData> =\n {\n errorSchema: openaiCompatibleErrorDataSchema,\n errorToMessage: data => data.error.message,\n };\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertOpenAICompatibleChatUsage(\n usage:\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: Math.max(0, completionTokens - reasoningTokens),\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4FilePart,\n type LanguageModelV4Prompt,\n type LanguageModelV4TextPart,\n type LanguageModelV4ToolResultOutput,\n type SharedV4ProviderMetadata,\n} from '@ai-sdk/provider';\nimport type {\n OpenAICompatibleChatPrompt,\n OpenAICompatibleContentPart,\n} from './openai-compatible-api-types';\nimport {\n convertBase64ToUint8Array,\n convertToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\n\nfunction getOpenAIMetadata(message: {\n providerOptions?: SharedV4ProviderMetadata;\n}) {\n return message?.providerOptions?.openaiCompatible ?? {};\n}\n\nfunction getAudioFormat(mediaType: string): 'wav' | 'mp3' | null {\n switch (mediaType) {\n case 'audio/wav':\n return 'wav';\n case 'audio/mp3':\n case 'audio/mpeg':\n return 'mp3';\n default:\n return null;\n }\n}\n\nfunction convertToOpenAICompatibleContentPart(\n part: LanguageModelV4TextPart | LanguageModelV4FilePart,\n provider: string,\n): OpenAICompatibleContentPart {\n const partMetadata = getOpenAIMetadata(part);\n\n switch (part.type) {\n case 'text': {\n return { type: 'text', text: part.text, ...partMetadata };\n }\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n return {\n type: 'file',\n file: {\n file_id: resolveProviderReference({\n reference: part.data.reference,\n provider,\n }),\n },\n ...partMetadata,\n };\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n const topLevel = getTopLevelMediaType(part.mediaType);\n\n if (topLevel === 'image') {\n return {\n type: 'image_url',\n image_url: {\n url:\n part.data.type === 'url'\n ? part.data.url.toString()\n : `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'video') {\n return {\n type: 'video_url',\n video_url: {\n url:\n part.data.type === 'url'\n ? part.data.url.toString()\n : `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'audio') {\n if (part.data.type === 'url') {\n throw new UnsupportedFunctionalityError({\n functionality: 'audio file parts with URLs',\n });\n }\n\n const fullMediaType = resolveFullMediaType({ part });\n const format = getAudioFormat(fullMediaType);\n if (format === null) {\n throw new UnsupportedFunctionalityError({\n functionality: `audio media type ${fullMediaType}`,\n });\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n data: convertToBase64(part.data.data),\n format,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'application') {\n if (part.data.type === 'url') {\n throw new UnsupportedFunctionalityError({\n functionality: 'PDF file parts with URLs',\n });\n }\n\n const fullMediaType = resolveFullMediaType({ part });\n if (fullMediaType !== 'application/pdf') {\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${fullMediaType}`,\n });\n }\n\n return {\n type: 'file',\n file: {\n filename: part.filename ?? 'document.pdf',\n file_data: `data:application/pdf;base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'text') {\n const textContent =\n part.data.type === 'url'\n ? part.data.url.toString()\n : typeof part.data.data === 'string'\n ? new TextDecoder().decode(\n convertBase64ToUint8Array(part.data.data),\n )\n : new TextDecoder().decode(part.data.data);\n\n return {\n type: 'text',\n text: textContent,\n ...partMetadata,\n };\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`,\n });\n }\n }\n }\n }\n}\n\nfunction convertToolContentPart(\n part: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'][number],\n provider: string,\n): OpenAICompatibleContentPart {\n if (part.type === 'custom') {\n throw new UnsupportedFunctionalityError({\n functionality: 'custom tool content parts',\n });\n }\n\n return convertToOpenAICompatibleContentPart(part, provider);\n}\n\nexport function convertToOpenAICompatibleChatMessages(\n prompt: LanguageModelV4Prompt,\n {\n provider = 'openaiCompatible',\n providerOptionsKey = 'google',\n supportsMultiPartToolContent = false,\n }: {\n provider?: string;\n providerOptionsKey?: string;\n supportsMultiPartToolContent?: boolean;\n } = {},\n): OpenAICompatibleChatPrompt {\n const messages: OpenAICompatibleChatPrompt = [];\n for (const { role, content, ...message } of prompt) {\n const metadata = getOpenAIMetadata({ ...message });\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content, ...metadata });\n break;\n }\n\n case 'user': {\n if (content.length === 1 && content[0].type === 'text') {\n messages.push({\n role: 'user',\n content: content[0].text,\n ...getOpenAIMetadata(content[0]),\n });\n break;\n }\n\n messages.push({\n role: 'user',\n content: content.map(part =>\n convertToOpenAICompatibleContentPart(part, provider),\n ),\n ...metadata,\n });\n\n break;\n }\n\n case 'assistant': {\n let text = '';\n let reasoning = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n extra_content?: {\n google?: {\n thought_signature?: string;\n };\n };\n }> = [];\n\n for (const part of content) {\n const partMetadata = getOpenAIMetadata(part);\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'reasoning': {\n reasoning += part.text;\n break;\n }\n case 'tool-call': {\n // TODO: thoughtSignature should be abstracted once we add support for other providers\n const thoughtSignature =\n part.providerOptions?.[providerOptionsKey]?.thoughtSignature ??\n part.providerOptions?.google?.thoughtSignature;\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n ...partMetadata,\n // Include extra_content for Google Gemini thought signatures\n ...(thoughtSignature\n ? {\n extra_content: {\n google: {\n thought_signature: String(thoughtSignature),\n },\n },\n }\n : {}),\n });\n break;\n }\n }\n }\n\n messages.push({\n role: 'assistant',\n content: toolCalls.length > 0 ? text || null : text,\n ...(reasoning.length > 0 ? { reasoning_content: reasoning } : {}),\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n ...metadata,\n });\n\n break;\n }\n\n case 'tool': {\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n\n const output = toolResponse.output;\n\n let contentValue: string | Array<OpenAICompatibleContentPart>;\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n case 'content':\n contentValue = supportsMultiPartToolContent\n ? output.value.map(part =>\n convertToolContentPart(part, provider),\n )\n : JSON.stringify(output.value);\n break;\n }\n\n const toolResponseMetadata = getOpenAIMetadata(toolResponse);\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: contentValue,\n ...toolResponseMetadata,\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import { createLanguageModelResponseMetadata } from '@ai-sdk/provider-utils';\n\nexport function getResponseMetadata({\n id,\n model,\n created,\n}: {\n id?: string | null;\n model?: string | null;\n created?: number | null;\n}) {\n return createLanguageModelResponseMetadata({\n id,\n model,\n // Some OpenAI-compatible providers use 0 as a placeholder timestamp.\n created: created || undefined,\n });\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapOpenAICompatibleFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import { z } from 'zod/v4';\n\nexport type OpenAICompatibleChatModelId = string;\n\nexport const openaiCompatibleLanguageModelChatOptions = z.object({\n /**\n * A unique identifier representing your end-user, which can help the provider to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`.\n */\n reasoningEffort: z.string().optional(),\n\n /**\n * Controls the verbosity of the generated text. Defaults to `medium`.\n */\n textVerbosity: z.string().optional(),\n\n /**\n * Whether to use strict JSON schema validation.\n * When true, the model uses constrained decoding to guarantee schema compliance.\n * Only used when the provider supports structured outputs and a schema is provided.\n *\n * @default true\n */\n strictJsonSchema: z.boolean().optional(),\n});\n\nexport type OpenAICompatibleLanguageModelChatOptions = z.infer<\n typeof openaiCompatibleLanguageModelChatOptions\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n }> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...(tool.strict != null ? { strict: tool.strict } : {}),\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","import {\n InvalidResponseDataError,\n type APICallError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4FinishReason,\n type LanguageModelV4GenerateResult,\n type LanguageModelV4StreamPart,\n type LanguageModelV4StreamResult,\n type LanguageModelV4Usage,\n type SharedV4ProviderMetadata,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n lazySchema,\n zodSchema,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type StreamingToolCallDelta,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n resolveProviderOptionsKey,\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleChatUsage } from './convert-openai-compatible-chat-usage';\nimport { convertToOpenAICompatibleChatMessages } from './convert-to-openai-compatible-chat-messages';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelChatOptions,\n type OpenAICompatibleChatModelId,\n} from './openai-compatible-chat-language-model-options';\nimport type { MetadataExtractor } from './openai-compatible-metadata-extractor';\nimport { prepareTools } from './openai-compatible-prepare-tools';\n\ntype OpenAICompatibleStreamingToolCallDelta = StreamingToolCallDelta & {\n extra_content?: {\n google?: {\n thought_signature?: string | null;\n } | null;\n } | null;\n};\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<any>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether the model supports multi-part content in tool results.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: (\n args: Record<string, any>,\n warnings?: SharedV4Warning[],\n ) => Record<string, any>;\n\n /**\n * Optional usage converter for OpenAI-compatible providers with different\n * token accounting semantics.\n */\n convertUsage?: (\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ) => LanguageModelV4Usage;\n};\n\ntype PendingToolCall = {\n id: string | null;\n bufferedArguments: string;\n extraContent: OpenAICompatibleStreamingToolCallDelta['extra_content'];\n};\n\nexport class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: OpenAICompatibleChatModelId;\n protected readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleChatConfig;\n }) {\n return new OpenAICompatibleChatLanguageModel(\n options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelId: OpenAICompatibleChatModelId,\n config: OpenAICompatibleChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n\n // initialize error handling:\n const errorStructure =\n config.errorStructure ?? defaultOpenAICompatibleErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(\n errorStructure.errorSchema,\n );\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure);\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private transformRequestBody(\n args: Record<string, any>,\n warnings: SharedV4Warning[],\n ): Record<string, any> {\n return this.config.transformRequestBody?.(args, warnings) ?? args;\n }\n\n private convertUsage(\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ): LanguageModelV4Usage {\n return (\n this.config.convertUsage?.(usage) ??\n convertOpenAICompatibleChatUsage(usage)\n );\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n );\n\n const strictJsonSchema = compatibleOptions?.strictJsonSchema ?? true;\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details:\n 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const metadataKey = resolveProviderOptionsKey(\n this.providerOptionsName,\n providerOptions,\n );\n\n return {\n metadataKey,\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n user: compatibleOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true &&\n responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n stop: stopSequences,\n seed,\n ...Object.fromEntries(\n Object.entries({\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n }).filter(\n ([key]) =>\n !Object.keys(\n openaiCompatibleLanguageModelChatOptions.shape,\n ).includes(key),\n ),\n ),\n\n reasoning_effort:\n compatibleOptions.reasoningEffort ??\n (isCustomReasoning(reasoning) ? reasoning : undefined),\n verbosity: compatibleOptions.textVerbosity,\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt, {\n provider: this.providerOptionsName,\n providerOptionsKey: metadataKey,\n supportsMultiPartToolContent:\n this.config.supportsMultiPartToolContent,\n }),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, metadataKey } = await this.getArgs({ ...options });\n\n const transformedBody = this.transformRequestBody(args, warnings);\n const body = JSON.stringify(transformedBody);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: transformedBody,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenAICompatibleChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n // reasoning content:\n const reasoning =\n choice.message.reasoning_content ?? choice.message.reasoning;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n content.push(...convertOpenAICompatibleContent(choice.message.content));\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n const thoughtSignature =\n toolCall.extra_content?.google?.thought_signature;\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n ...(thoughtSignature\n ? {\n providerMetadata: {\n [metadataKey]: { thoughtSignature },\n },\n }\n : {}),\n });\n }\n }\n\n // provider metadata:\n const providerMetadata: SharedV4ProviderMetadata = {\n [metadataKey]: {},\n ...(await this.config.metadataExtractor?.extractMetadata?.({\n parsedBody: rawResponse,\n })),\n };\n const completionTokenDetails =\n responseBody.usage?.completion_tokens_details;\n if (completionTokenDetails?.accepted_prediction_tokens != null) {\n providerMetadata[metadataKey].acceptedPredictionTokens =\n completionTokenDetails?.accepted_prediction_tokens;\n }\n if (completionTokenDetails?.rejected_prediction_tokens != null) {\n providerMetadata[metadataKey].rejectedPredictionTokens =\n completionTokenDetails?.rejected_prediction_tokens;\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: this.convertUsage(responseBody.usage),\n providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, metadataKey } = await this.getArgs({\n ...options,\n });\n\n const body = this.transformRequestBody(\n {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n },\n warnings,\n );\n\n const metadataExtractor =\n this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const providerOptionsName = metadataKey;\n let toolCallTracker: StreamingToolCallTracker<OpenAICompatibleStreamingToolCallDelta>;\n\n // Buffers tool-call deltas by `index` until `function.name` is known.\n // Some OpenAI-compatible providers send the first delta without\n // `function.name`, which the shared tracker rejects on first chunk.\n const pendingToolCalls = new Map<number, PendingToolCall>();\n const forwardedToolCallIndices = new Set<number>();\n\n const processToolCallDelta = (\n toolCallDelta: OpenAICompatibleStreamingToolCallDelta,\n ) => {\n const index = toolCallDelta.index;\n\n if (index == null || forwardedToolCallIndices.has(index)) {\n toolCallTracker.processDelta(toolCallDelta);\n return;\n }\n\n let pending = pendingToolCalls.get(index);\n if (pending == null) {\n pending = {\n id: toolCallDelta.id ?? null,\n bufferedArguments: '',\n extraContent: toolCallDelta.extra_content ?? null,\n };\n pendingToolCalls.set(index, pending);\n } else {\n if (pending.id == null && toolCallDelta.id != null) {\n pending.id = toolCallDelta.id;\n }\n if (\n pending.extraContent == null &&\n toolCallDelta.extra_content != null\n ) {\n pending.extraContent = toolCallDelta.extra_content;\n }\n }\n\n const argumentsDelta = toolCallDelta.function?.arguments;\n if (argumentsDelta != null) {\n pending.bufferedArguments += argumentsDelta;\n }\n\n const name = toolCallDelta.function?.name;\n if (name != null) {\n const forwardDelta: OpenAICompatibleStreamingToolCallDelta = {\n index,\n id: pending.id,\n function: {\n name,\n arguments: pending.bufferedArguments,\n },\n extra_content: pending.extraContent ?? undefined,\n };\n toolCallTracker.processDelta(forwardDelta);\n pendingToolCalls.delete(index);\n forwardedToolCallIndices.add(index);\n }\n };\n\n let finishReason: LanguageModelV4FinishReason | undefined;\n let usage:\n | z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>\n | undefined = undefined;\n let metadataExtracted = false;\n let isActiveReasoning = false;\n let isActiveText = false;\n const convertUsage = (\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ) => this.convertUsage(usage);\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker =\n new StreamingToolCallTracker<OpenAICompatibleStreamingToolCallDelta>(\n controller,\n {\n generateId,\n extractMetadata: delta => {\n const thoughtSignature =\n delta.extra_content?.google?.thought_signature;\n\n return thoughtSignature\n ? { [providerOptionsName]: { thoughtSignature } }\n : undefined;\n },\n buildToolCallProviderMetadata: metadata => metadata,\n },\n );\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // handle error chunks:\n if ('error' in chunk.value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: chunk.value.error,\n });\n return;\n }\n\n // TODO we lost type safety on Chunk, most likely due to the error schema. MUST FIX\n // remove this workaround when the issue is fixed\n const value = chunk.value as z.infer<\n ReturnType<typeof chunkBaseSchema>\n >;\n\n // Extract and emit response metadata once. Usually it comes in the\n // first chunk, but some providers prepend a placeholder chunk with\n // empty metadata.\n if (!metadataExtracted) {\n const metadata = getResponseMetadata(value);\n if (Object.values(metadata).some(Boolean)) {\n metadataExtracted = true;\n controller.enqueue({\n type: 'response-metadata',\n ...metadata,\n });\n }\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n const enqueueReasoningDelta = (reasoningDelta: string) => {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n isActiveText = false;\n }\n\n if (!isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-start',\n id: 'reasoning-0',\n });\n isActiveReasoning = true;\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: reasoningDelta,\n });\n };\n\n const enqueueTextDelta = (textDelta: string) => {\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'txt-0' });\n isActiveText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'txt-0',\n delta: textDelta,\n });\n };\n\n // enqueue reasoning before text deltas:\n const reasoningContent = delta.reasoning_content ?? delta.reasoning;\n if (reasoningContent) {\n enqueueReasoningDelta(reasoningContent);\n }\n\n for (const contentPart of convertOpenAICompatibleContent(\n delta.content,\n )) {\n if (contentPart.type === 'reasoning') {\n enqueueReasoningDelta(contentPart.text);\n } else {\n enqueueTextDelta(contentPart.text);\n }\n }\n\n if (delta.tool_calls != null && delta.tool_calls.length > 0) {\n // end active reasoning block before tool calls start\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n processToolCallDelta(toolCallDelta);\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n }\n\n // Forward any tool-call deltas that never received a\n // `function.name`. The tracker will throw on the missing name,\n // preserving the original invalid-response semantics.\n for (const [index, pending] of pendingToolCalls) {\n toolCallTracker.processDelta({\n index,\n id: pending.id,\n function: { arguments: pending.bufferedArguments },\n });\n }\n pendingToolCalls.clear();\n\n toolCallTracker.flush();\n\n if (finishReason == null) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new InvalidResponseDataError({\n data: undefined,\n message: 'Response stream ended without a finish reason.',\n }),\n });\n }\n\n const providerMetadata: SharedV4ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (\n usage?.completion_tokens_details?.accepted_prediction_tokens !=\n null\n ) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage?.completion_tokens_details?.accepted_prediction_tokens;\n }\n if (\n usage?.completion_tokens_details?.rejected_prediction_tokens !=\n null\n ) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage?.completion_tokens_details?.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\n// Loose, nested objects included: the parsed value is returned as `usage.raw`.\nconst openaiCompatibleTokenUsageSchema = () =>\n z\n .looseObject({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\nconst openAICompatibleContentSchema = () =>\n z\n .union([\n z.string(),\n z.array(\n z.looseObject({\n type: z.string(),\n }),\n ),\n ])\n .nullish();\n\nfunction convertOpenAICompatibleContent(\n content: z.infer<ReturnType<typeof openAICompatibleContentSchema>>,\n): Array<Extract<LanguageModelV4Content, { type: 'text' | 'reasoning' }>> {\n if (content == null) {\n return [];\n }\n\n if (typeof content === 'string') {\n return content.length > 0 ? [{ type: 'text', text: content }] : [];\n }\n\n const result: Array<\n Extract<LanguageModelV4Content, { type: 'text' | 'reasoning' }>\n > = [];\n\n for (const part of content) {\n if (part.type === 'text' && typeof part.text === 'string') {\n if (part.text.length > 0) {\n result.push({ type: 'text', text: part.text });\n }\n } else if (part.type === 'thinking' && Array.isArray(part.thinking)) {\n const reasoningText = part.thinking\n .filter(\n chunk =>\n chunk != null &&\n typeof chunk === 'object' &&\n 'type' in chunk &&\n chunk.type === 'text' &&\n 'text' in chunk &&\n typeof chunk.text === 'string',\n )\n .map(chunk => chunk.text)\n .join('');\n\n if (reasoningText.length > 0) {\n result.push({ type: 'reasoning', text: reasoningText });\n }\n }\n }\n\n return result;\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: openAICompatibleContentSchema(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n // Support for Google Gemini thought signatures via OpenAI compatibility\n extra_content: z\n .object({\n google: z\n .object({\n thought_signature: z.string().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: openaiCompatibleTokenUsageSchema(),\n }),\n ),\n);\n\nconst chunkBaseSchema = () =>\n z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant', '']).nullish(),\n content: openAICompatibleContentSchema(),\n // Most openai-compatible models set `reasoning_content`, but some\n // providers serving `gpt-oss` set `reasoning`. See #7866\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(), //google does not send index\n id: z.string().nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n // Support for Google Gemini thought signatures via OpenAI compatibility\n extra_content: z\n .object({\n google: z\n .object({\n thought_signature: z.string().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: openaiCompatibleTokenUsageSchema(),\n });\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <\n ERROR_SCHEMA extends z.core.$ZodType,\n>(\n errorSchema: ERROR_SCHEMA,\n) => z.union([chunkBaseSchema(), errorSchema]);\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertOpenAICompatibleCompletionUsage(\n usage:\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens,\n reasoning: undefined,\n },\n raw: usage,\n };\n}\n","import {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nexport function convertToOpenAICompatibleCompletionPrompt({\n prompt,\n user = 'user',\n assistant = 'assistant',\n}: {\n prompt: LanguageModelV4Prompt;\n user?: string;\n assistant?: string;\n}): {\n prompt: string;\n stopSequences?: string[];\n} {\n // transform to a chat message format:\n let text = '';\n\n // if first message is a system message, add it to the text:\n if (prompt[0].role === 'system') {\n text += `${prompt[0].content}\\n\\n`;\n prompt = prompt.slice(1);\n }\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n throw new InvalidPromptError({\n message: `Unexpected system message in prompt: ${content}`,\n prompt,\n });\n }\n\n case 'user': {\n const userMessage = content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n }\n })\n .filter(Boolean)\n .join('');\n\n text += `${user}:\\n${userMessage}\\n\\n`;\n break;\n }\n\n case 'assistant': {\n const assistantMessage = content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-call messages',\n });\n }\n }\n })\n .join('');\n\n text += `${assistant}:\\n${assistantMessage}\\n\\n`;\n break;\n }\n\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool messages',\n });\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n // Assistant message prefix:\n text += `${assistant}:\\n`;\n\n return {\n prompt: text,\n stopSequences: [`\\n${user}:`],\n };\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapOpenAICompatibleFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type OpenAICompatibleCompletionModelId = string;\n\nexport const openaiCompatibleLanguageModelCompletionOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Echo back the prompt in addition to the completion.\n */\n echo: z.boolean().optional(),\n\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100.\n */\n logitBias: z.record(z.string(), z.number()).optional(),\n\n /**\n * The suffix that comes after a completion of inserted text.\n */\n suffix: z.string().optional(),\n\n /**\n * A unique identifier representing your end-user, which can help providers to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n }),\n ),\n);\n\nexport type OpenAICompatibleLanguageModelCompletionOptions = InferSchema<\n typeof openaiCompatibleLanguageModelCompletionOptions\n>;\n","import type {\n APICallError,\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n lazySchema,\n zodSchema,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleCompletionUsage } from './convert-openai-compatible-completion-usage';\nimport { convertToOpenAICompatibleCompletionPrompt } from './convert-to-openai-compatible-completion-prompt';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelCompletionOptions,\n type OpenAICompatibleCompletionModelId,\n} from './openai-compatible-completion-language-model-options';\ntype OpenAICompatibleCompletionConfig = {\n provider: string;\n includeUsage?: boolean;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport class OpenAICompatibleCompletionLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: OpenAICompatibleCompletionModelId;\n private readonly config: OpenAICompatibleCompletionConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleCompletionLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleCompletionConfig;\n }) {\n return new OpenAICompatibleCompletionLanguageModel(\n options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelId: OpenAICompatibleCompletionModelId,\n config: OpenAICompatibleCompletionConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n\n // initialize error handling:\n const errorStructure =\n config.errorStructure ?? defaultOpenAICompatibleErrorStructure;\n this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(\n errorStructure.errorSchema,\n );\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure);\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences: userStopSequences,\n responseFormat,\n seed,\n providerOptions,\n tools,\n toolChoice,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n // Parse provider options (support both raw and camelCase keys)\n const completionOptions = Object.assign(\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelCompletionOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelCompletionOptions,\n })) ?? {},\n );\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (tools?.length) {\n warnings.push({ type: 'unsupported', feature: 'tools' });\n }\n\n if (toolChoice != null) {\n warnings.push({ type: 'unsupported', feature: 'toolChoice' });\n }\n\n if (responseFormat != null && responseFormat.type !== 'text') {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format is not supported.',\n });\n }\n\n const { prompt: completionPrompt, stopSequences } =\n convertToOpenAICompatibleCompletionPrompt({ prompt });\n\n const stop = [...(stopSequences ?? []), ...(userStopSequences ?? [])];\n\n return {\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n echo: completionOptions.echo,\n logit_bias: completionOptions.logitBias,\n suffix: completionOptions.suffix,\n user: completionOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n\n // prompt:\n prompt: completionPrompt,\n\n // stop sequences:\n stop: stop.length > 0 ? stop : undefined,\n },\n warnings,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleCompletionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n if (choice.text != null && choice.text.length > 0) {\n content.push({ type: 'text', text: choice.text });\n }\n\n return {\n content,\n usage: convertOpenAICompatibleCompletionUsage(response.usage),\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n },\n request: { body: args },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage:\n | {\n prompt_tokens: number | undefined;\n completion_tokens: number | undefined;\n total_tokens: number | undefined;\n }\n | undefined = undefined;\n let isFirstChunk = true;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: value.error });\n return;\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n\n controller.enqueue({\n type: 'text-start',\n id: '0',\n });\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n };\n }\n\n if (choice?.text != null) {\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: choice.text,\n });\n }\n },\n\n flush(controller) {\n if (!isFirstChunk) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleCompletionUsage(usage),\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\n// Loose: the parsed value is returned as `usage.raw`.\nconst usageSchema = () =>\n z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n });\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleCompletionResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string(),\n }),\n ),\n usage: usageSchema().nullish(),\n }),\n ),\n);\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleCompletionChunkSchema = <\n ERROR_SCHEMA extends z.core.$ZodType,\n>(\n errorSchema: ERROR_SCHEMA,\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: usageSchema().nullish(),\n }),\n errorSchema,\n ]);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type OpenAICompatibleEmbeddingModelId = string;\n\nexport const openaiCompatibleEmbeddingModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in text-embedding-3 and later models.\n */\n dimensions: z.number().optional(),\n\n /**\n * A unique identifier representing your end-user, which can help providers to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n }),\n ),\n);\n\nexport type OpenAICompatibleEmbeddingModelOptions = InferSchema<\n typeof openaiCompatibleEmbeddingModelOptions\n>;\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n lazySchema,\n zodSchema,\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n openaiCompatibleEmbeddingModelOptions,\n type OpenAICompatibleEmbeddingModelId,\n} from './openai-compatible-embedding-model-options';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { warnIfDeprecatedProviderOptionsKey } from '../utils/to-camel-case';\n\ntype OpenAICompatibleEmbeddingConfig = {\n /**\n * Override the maximum number of embeddings per call.\n */\n maxEmbeddingsPerCall?: number;\n\n /**\n * Override the parallelism of embedding calls.\n */\n supportsParallelCalls?: boolean;\n\n provider: string;\n url: (options: { modelId: string; path: string }) => string;\n headers?: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n};\n\nexport class OpenAICompatibleEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: OpenAICompatibleEmbeddingModelId;\n\n private readonly config: OpenAICompatibleEmbeddingConfig;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxEmbeddingsPerCall(): number {\n return this.config.maxEmbeddingsPerCall ?? 2048;\n }\n\n get supportsParallelCalls(): boolean {\n return this.config.supportsParallelCalls ?? true;\n }\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleEmbeddingConfig;\n }) {\n return new OpenAICompatibleEmbeddingModel(options.modelId, options.config);\n }\n\n constructor(\n modelId: OpenAICompatibleEmbeddingModelId,\n config: OpenAICompatibleEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n async doEmbed({\n values,\n dimensions,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n })) ?? {},\n );\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/embeddings',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), headers),\n body: {\n model: this.modelId,\n input: values,\n encoding_format: 'float',\n dimensions: compatibleOptions.dimensions ?? dimensions,\n user: compatibleOptions.user,\n },\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiTextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings,\n embeddings: response.data.map(item => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.prompt_tokens }\n : undefined,\n providerMetadata: response.providerMetadata,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiTextEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n data: z.array(z.object({ embedding: z.array(z.number()) })),\n usage: z.object({ prompt_tokens: z.number() }).nullish(),\n providerMetadata: z\n .record(z.string(), z.record(z.string(), z.any()))\n .optional(),\n }),\n ),\n);\n","import {\n InvalidResponseDataError,\n type ImageModelV4,\n type ImageModelV4File,\n type ImageModelV4Usage,\n type SharedV4ProviderOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n lazySchema,\n zodSchema,\n type InferSchema,\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n downloadBlob,\n getFromApi,\n postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport type { OpenAICompatibleImageModelId } from './openai-compatible-image-settings';\n\nexport type OpenAICompatibleImageModelConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n _internal?: {\n currentDate?: () => Date;\n };\n};\n\nexport class OpenAICompatibleImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 10;\n readonly supportsFileInputs = undefined;\n readonly supportsMaskInputs = undefined;\n\n get provider(): string {\n return this.config.provider;\n }\n\n /**\n * The provider options key used to extract provider-specific options.\n */\n private get providerOptionsKey(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleImageModelConfig;\n }) {\n return new OpenAICompatibleImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: OpenAICompatibleImageModelId,\n private readonly config: OpenAICompatibleImageModelConfig,\n ) {}\n\n private getArgs(\n providerOptions: SharedV4ProviderOptions,\n warnings: SharedV4Warning[],\n ): Record<string, unknown> {\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsKey,\n providerOptions,\n warnings,\n });\n return {\n ...providerOptions[this.providerOptionsKey],\n ...providerOptions[toCamelCase(this.providerOptionsKey)],\n };\n }\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'This model does not support aspect ratio. Use `size` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const args = this.getArgs(providerOptions, warnings);\n const isEditing = files != null && files.length > 0;\n const url = this.config.url({\n path: isEditing ? '/images/edits' : '/images/generations',\n modelId: this.modelId,\n });\n const requestHeaders = combineHeaders(this.config.headers?.(), headers);\n\n // Image editing mode - use form data and /images/edits endpoint\n if (isEditing) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url,\n headers: requestHeaders,\n formData: convertToFormData<OpenAICompatibleFormDataInput>({\n model: this.modelId,\n prompt,\n image: await Promise.all(files.map(file => fileToBlob(file))),\n mask: mask != null ? await fileToBlob(mask) : undefined,\n n,\n size,\n ...args,\n }),\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: await this.getImages(response.data, {\n url,\n headers: requestHeaders,\n abortSignal,\n }),\n warnings,\n usage: mapImageUsage(response.usage),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n // Standard image generation mode - use JSON and /images/generations endpoint\n const { value: response, responseHeaders } = await postJsonToApi({\n url,\n headers: requestHeaders,\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...args,\n },\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: await this.getImages(response.data, {\n url,\n headers: requestHeaders,\n abortSignal,\n }),\n warnings,\n usage: mapImageUsage(response.usage),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private async getImages(\n data: InferSchema<typeof openaiCompatibleImageResponseSchema>['data'],\n options: {\n url: string;\n headers: Record<string, string | undefined>;\n abortSignal: AbortSignal | undefined;\n },\n ): Promise<string[] | Uint8Array[]> {\n // Preserve base64 responses without conversion\n if (data.every(image => image.b64_json != null)) {\n return data.map(image => image.b64_json!);\n }\n\n return Promise.all(\n data.map(async image => {\n if (image.b64_json != null) {\n return convertBase64ToUint8Array(image.b64_json);\n }\n\n if (image.url == null) {\n throw new InvalidResponseDataError({\n data: image,\n message: 'Expected url in the image response',\n });\n }\n\n const { value } = await getFromApi({\n url: image.url,\n validateUrl: true,\n trustedOrigin: options.url,\n credentialedOrigin: options.url,\n headers: options.headers,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n });\n return value;\n }),\n );\n }\n}\n\n// Providers that omit `usage` are not warned about: many OpenAI-compatible\n// backends legitimately do not report token counts for image generation.\nfunction mapImageUsage(\n usage: InferSchema<typeof openaiCompatibleImageResponseSchema>['usage'],\n): ImageModelV4Usage | undefined {\n return usage == null\n ? undefined\n : {\n inputTokens: usage.input_tokens ?? undefined,\n outputTokens: usage.output_tokens ?? undefined,\n totalTokens: usage.total_tokens ?? undefined,\n };\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleImageResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n data: z.array(\n z\n .object({\n b64_json: z.string().nullish(),\n url: z.string().nullish(),\n })\n .refine(image => image.b64_json != null || image.url != null, {\n message: 'Expected b64_json or url in the image response',\n }),\n ),\n usage: z\n .object({\n input_tokens: z.number().nullish(),\n output_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\ntype OpenAICompatibleFormDataInput = {\n model: string;\n prompt: string | undefined;\n image: Blob | Blob[];\n mask?: Blob;\n n: number;\n size: `${number}x${number}` | undefined;\n [key: string]: unknown;\n};\n\nasync function fileToBlob(file: ImageModelV4File): Promise<Blob> {\n if (file.type === 'url') {\n return downloadBlob(file.url);\n }\n\n const data =\n file.data instanceof Uint8Array\n ? file.data\n : convertBase64ToUint8Array(file.data);\n\n return new Blob([data as BlobPart], { type: file.mediaType });\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import type {\n EmbeddingModelV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n OpenAICompatibleChatLanguageModel,\n type OpenAICompatibleChatConfig,\n} from './chat/openai-compatible-chat-language-model';\nimport type { MetadataExtractor } from './chat/openai-compatible-metadata-extractor';\nimport { OpenAICompatibleCompletionLanguageModel } from './completion/openai-compatible-completion-language-model';\nimport { OpenAICompatibleEmbeddingModel } from './embedding/openai-compatible-embedding-model';\nimport { OpenAICompatibleImageModel } from './image/openai-compatible-image-model';\nimport { VERSION } from './version';\n\nexport interface OpenAICompatibleProvider<\n CHAT_MODEL_IDS extends string = string,\n COMPLETION_MODEL_IDS extends string = string,\n EMBEDDING_MODEL_IDS extends string = string,\n IMAGE_MODEL_IDS extends string = string,\n> extends ProviderV4 {\n (modelId: CHAT_MODEL_IDS): LanguageModelV4;\n\n languageModel(\n modelId: CHAT_MODEL_IDS,\n config?: Partial<OpenAICompatibleChatConfig>,\n ): LanguageModelV4;\n\n chatModel(modelId: CHAT_MODEL_IDS): LanguageModelV4;\n\n completionModel(modelId: COMPLETION_MODEL_IDS): LanguageModelV4;\n\n embeddingModel(modelId: EMBEDDING_MODEL_IDS): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: EMBEDDING_MODEL_IDS): EmbeddingModelV4;\n\n imageModel(modelId: IMAGE_MODEL_IDS): ImageModelV4;\n}\n\nexport interface OpenAICompatibleProviderSettings {\n /**\n * Base URL for the API calls.\n */\n baseURL: string;\n\n /**\n * Provider name.\n */\n name: string;\n\n /**\n * API key for authenticating requests. If specified, adds an `Authorization`\n * header to request headers with the value `Bearer <apiKey>`. This will be added\n * before any headers potentially specified in the `headers` option.\n */\n apiKey?: string;\n\n /**\n * Optional custom headers to include in requests. These will be added to request headers\n * after any headers potentially added by use of the `apiKey` option.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional custom url query parameters to include in request urls.\n */\n queryParams?: 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 * Include usage information in streaming responses.\n */\n includeUsage?: boolean;\n\n /**\n * Whether the provider supports structured outputs in chat models.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether chat models support multi-part content in tool results.\n *\n * Enable this for providers that extend the OpenAI Chat Completions API with\n * structured tool-result content. Defaults to `false`.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: OpenAICompatibleChatConfig['transformRequestBody'];\n\n /**\n * Optional metadata extractor to capture provider-specific metadata from API responses.\n * This is useful for extracting non-standard fields, experimental features,\n * or provider-specific metrics from both streaming and non-streaming responses.\n */\n metadataExtractor?: MetadataExtractor;\n\n /**\n * The supported URLs for chat models.\n */\n supportedUrls?: OpenAICompatibleChatConfig['supportedUrls'];\n\n /**\n * Optional usage converter for providers with token accounting semantics that\n * differ from the default OpenAI-compatible shape.\n */\n convertUsage?: OpenAICompatibleChatConfig['convertUsage'];\n}\n\n/**\n * Create an OpenAICompatible provider instance.\n */\nexport function createOpenAICompatible<\n CHAT_MODEL_IDS extends string,\n COMPLETION_MODEL_IDS extends string,\n EMBEDDING_MODEL_IDS extends string,\n IMAGE_MODEL_IDS extends string,\n>(\n options: OpenAICompatibleProviderSettings,\n): OpenAICompatibleProvider<\n CHAT_MODEL_IDS,\n COMPLETION_MODEL_IDS,\n EMBEDDING_MODEL_IDS,\n IMAGE_MODEL_IDS\n> {\n const baseURL = withoutTrailingSlash(options.baseURL);\n const providerName = options.name;\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const headers = {\n ...(options.apiKey && { Authorization: `Bearer ${options.apiKey}` }),\n ...options.headers,\n };\n\n const getHeaders = () =>\n withUserAgentSuffix(headers, `ai-sdk-openai-compatible/${VERSION}`);\n\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `${providerName}.${modelType}`,\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createLanguageModel = (modelId: CHAT_MODEL_IDS) =>\n createChatModel(modelId);\n\n const createChatModel = (modelId: CHAT_MODEL_IDS) =>\n new OpenAICompatibleChatLanguageModel(modelId, {\n ...getCommonModelConfig('chat'),\n includeUsage: options.includeUsage,\n supportsStructuredOutputs: options.supportsStructuredOutputs,\n supportsMultiPartToolContent: options.supportsMultiPartToolContent,\n supportedUrls: options.supportedUrls,\n transformRequestBody: options.transformRequestBody,\n metadataExtractor: options.metadataExtractor,\n convertUsage: options.convertUsage,\n });\n\n const createCompletionModel = (modelId: COMPLETION_MODEL_IDS) =>\n new OpenAICompatibleCompletionLanguageModel(modelId, {\n ...getCommonModelConfig('completion'),\n includeUsage: options.includeUsage,\n });\n\n const createEmbeddingModel = (modelId: EMBEDDING_MODEL_IDS) =>\n new OpenAICompatibleEmbeddingModel(modelId, {\n ...getCommonModelConfig('embedding'),\n });\n\n const createImageModel = (modelId: IMAGE_MODEL_IDS) =>\n new OpenAICompatibleImageModel(modelId, getCommonModelConfig('image'));\n\n const provider = (modelId: CHAT_MODEL_IDS) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createChatModel;\n provider.completionModel = createCompletionModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.imageModel = createImageModel;\n\n return provider as OpenAICompatibleProvider<\n CHAT_MODEL_IDS,\n COMPLETION_MODEL_IDS,\n EMBEDDING_MODEL_IDS,\n IMAGE_MODEL_IDS\n >;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_exhaustiveCheck","getResponseMetadata","mapOpenAICompatibleFinishReason","_exhaustiveCheck","mapOpenAICompatibleFinishReason","getResponseMetadata","_exhaustiveCheck"],"sources":["../src/utils/to-camel-case.ts","../src/openai-compatible-error.ts","../src/chat/convert-openai-compatible-chat-usage.ts","../src/chat/convert-to-openai-compatible-chat-messages.ts","../src/chat/get-response-metadata.ts","../src/chat/map-openai-compatible-finish-reason.ts","../src/chat/openai-compatible-chat-language-model-options.ts","../src/chat/openai-compatible-prepare-tools.ts","../src/chat/openai-compatible-chat-language-model.ts","../src/completion/convert-openai-compatible-completion-usage.ts","../src/completion/convert-to-openai-compatible-completion-prompt.ts","../src/completion/map-openai-compatible-finish-reason.ts","../src/completion/openai-compatible-completion-language-model-options.ts","../src/completion/openai-compatible-completion-language-model.ts","../src/embedding/openai-compatible-embedding-model-options.ts","../src/embedding/openai-compatible-embedding-model.ts","../src/image/openai-compatible-image-model.ts","../src/version.ts","../src/openai-compatible-provider.ts"],"sourcesContent":["import type { SharedV4Warning } from '@ai-sdk/provider';\n\nexport function toCamelCase(str: string): string {\n return str.replace(/[_-]([a-z])/g, g => g[1].toUpperCase());\n}\n\n/**\nResolves which key to use for providerMetadata based on what the caller\npassed in providerOptions. Returns the camelCase variant when the caller\nsupplied it, otherwise falls back to the raw name.\n*/\nexport function resolveProviderOptionsKey(\n rawName: string,\n providerOptions: Record<string, unknown> | undefined,\n): string {\n const camelName = toCamelCase(rawName);\n if (camelName !== rawName && providerOptions?.[camelName] != null) {\n return camelName;\n }\n return rawName;\n}\n\n/**\nPushes a deprecation warning when the user supplies providerOptions under a non-camelCase key\n*/\nexport function warnIfDeprecatedProviderOptionsKey({\n rawName,\n providerOptions,\n warnings,\n}: {\n rawName: string;\n providerOptions: Record<string, unknown> | undefined;\n warnings: SharedV4Warning[];\n}): void {\n const camelName = toCamelCase(rawName);\n if (camelName !== rawName && providerOptions?.[rawName] != null) {\n warnings.push({\n type: 'deprecated',\n setting: `providerOptions key '${rawName}'`,\n message: `Use '${camelName}' instead.`,\n });\n }\n}\n","import { z, type ZodType } from 'zod/v4';\nexport const openaiCompatibleErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n\n // The additional information below is handled loosely to support\n // OpenAI-compatible providers that have slightly different error\n // responses:\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n});\n\nexport type OpenAICompatibleErrorData = z.infer<\n typeof openaiCompatibleErrorDataSchema\n>;\n\nexport type ProviderErrorStructure<T> = {\n errorSchema: ZodType<T>;\n errorToMessage: (error: T) => string;\n isRetryable?: (response: Response, error?: T) => boolean;\n};\n\nexport const defaultOpenAICompatibleErrorStructure: ProviderErrorStructure<OpenAICompatibleErrorData> =\n {\n errorSchema: openaiCompatibleErrorDataSchema,\n errorToMessage: data => data.error.message,\n };\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertOpenAICompatibleChatUsage(\n usage:\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: Math.max(0, completionTokens - reasoningTokens),\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4FilePart,\n type LanguageModelV4Prompt,\n type LanguageModelV4TextPart,\n type LanguageModelV4ToolResultOutput,\n type SharedV4ProviderMetadata,\n} from '@ai-sdk/provider';\nimport type {\n OpenAICompatibleChatPrompt,\n OpenAICompatibleContentPart,\n} from './openai-compatible-api-types';\nimport {\n convertBase64ToUint8Array,\n convertToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\n\nfunction getOpenAIMetadata(message: {\n providerOptions?: SharedV4ProviderMetadata;\n}) {\n return message?.providerOptions?.openaiCompatible ?? {};\n}\n\nfunction getAudioFormat(mediaType: string): 'wav' | 'mp3' | null {\n switch (mediaType) {\n case 'audio/wav':\n return 'wav';\n case 'audio/mp3':\n case 'audio/mpeg':\n return 'mp3';\n default:\n return null;\n }\n}\n\nfunction convertToOpenAICompatibleContentPart(\n part: LanguageModelV4TextPart | LanguageModelV4FilePart,\n provider: string,\n): OpenAICompatibleContentPart {\n const partMetadata = getOpenAIMetadata(part);\n\n switch (part.type) {\n case 'text': {\n return { type: 'text', text: part.text, ...partMetadata };\n }\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n return {\n type: 'file',\n file: {\n file_id: resolveProviderReference({\n reference: part.data.reference,\n provider,\n }),\n },\n ...partMetadata,\n };\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n const topLevel = getTopLevelMediaType(part.mediaType);\n\n if (topLevel === 'image') {\n return {\n type: 'image_url',\n image_url: {\n url:\n part.data.type === 'url'\n ? part.data.url.toString()\n : `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'video') {\n return {\n type: 'video_url',\n video_url: {\n url:\n part.data.type === 'url'\n ? part.data.url.toString()\n : `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'audio') {\n if (part.data.type === 'url') {\n throw new UnsupportedFunctionalityError({\n functionality: 'audio file parts with URLs',\n });\n }\n\n const fullMediaType = resolveFullMediaType({ part });\n const format = getAudioFormat(fullMediaType);\n if (format === null) {\n throw new UnsupportedFunctionalityError({\n functionality: `audio media type ${fullMediaType}`,\n });\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n data: convertToBase64(part.data.data),\n format,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'application') {\n if (part.data.type === 'url') {\n throw new UnsupportedFunctionalityError({\n functionality: 'PDF file parts with URLs',\n });\n }\n\n const fullMediaType = resolveFullMediaType({ part });\n if (fullMediaType !== 'application/pdf') {\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${fullMediaType}`,\n });\n }\n\n return {\n type: 'file',\n file: {\n filename: part.filename ?? 'document.pdf',\n file_data: `data:application/pdf;base64,${convertToBase64(part.data.data)}`,\n },\n ...partMetadata,\n };\n }\n\n if (topLevel === 'text') {\n const textContent =\n part.data.type === 'url'\n ? part.data.url.toString()\n : typeof part.data.data === 'string'\n ? new TextDecoder().decode(\n convertBase64ToUint8Array(part.data.data),\n )\n : new TextDecoder().decode(part.data.data);\n\n return {\n type: 'text',\n text: textContent,\n ...partMetadata,\n };\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`,\n });\n }\n }\n }\n }\n}\n\nfunction convertToolContentPart(\n part: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'][number],\n provider: string,\n): OpenAICompatibleContentPart {\n if (part.type === 'custom') {\n throw new UnsupportedFunctionalityError({\n functionality: 'custom tool content parts',\n });\n }\n\n return convertToOpenAICompatibleContentPart(part, provider);\n}\n\nexport function convertToOpenAICompatibleChatMessages(\n prompt: LanguageModelV4Prompt,\n {\n provider = 'openaiCompatible',\n providerOptionsKey = 'google',\n supportsMultiPartToolContent = false,\n }: {\n provider?: string;\n providerOptionsKey?: string;\n supportsMultiPartToolContent?: boolean;\n } = {},\n): OpenAICompatibleChatPrompt {\n const messages: OpenAICompatibleChatPrompt = [];\n for (const { role, content, ...message } of prompt) {\n const metadata = getOpenAIMetadata({ ...message });\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content, ...metadata });\n break;\n }\n\n case 'user': {\n if (content.length === 1 && content[0].type === 'text') {\n messages.push({\n role: 'user',\n content: content[0].text,\n ...getOpenAIMetadata(content[0]),\n });\n break;\n }\n\n messages.push({\n role: 'user',\n content: content.map(part =>\n convertToOpenAICompatibleContentPart(part, provider),\n ),\n ...metadata,\n });\n\n break;\n }\n\n case 'assistant': {\n let text = '';\n let reasoning = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n extra_content?: {\n google?: {\n thought_signature?: string;\n };\n };\n }> = [];\n\n for (const part of content) {\n const partMetadata = getOpenAIMetadata(part);\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'reasoning': {\n reasoning += part.text;\n break;\n }\n case 'tool-call': {\n // TODO: thoughtSignature should be abstracted once we add support for other providers\n const thoughtSignature =\n part.providerOptions?.[providerOptionsKey]?.thoughtSignature ??\n part.providerOptions?.google?.thoughtSignature;\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n ...partMetadata,\n // Include extra_content for Google Gemini thought signatures\n ...(thoughtSignature\n ? {\n extra_content: {\n google: {\n thought_signature: String(thoughtSignature),\n },\n },\n }\n : {}),\n });\n break;\n }\n }\n }\n\n messages.push({\n role: 'assistant',\n content: toolCalls.length > 0 ? text || null : text,\n ...(reasoning.length > 0 ? { reasoning_content: reasoning } : {}),\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n ...metadata,\n });\n\n break;\n }\n\n case 'tool': {\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n\n const output = toolResponse.output;\n\n let contentValue: string | Array<OpenAICompatibleContentPart>;\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n case 'content':\n contentValue = supportsMultiPartToolContent\n ? output.value.map(part =>\n convertToolContentPart(part, provider),\n )\n : JSON.stringify(output.value);\n break;\n }\n\n const toolResponseMetadata = getOpenAIMetadata(toolResponse);\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: contentValue,\n ...toolResponseMetadata,\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import { createLanguageModelResponseMetadata } from '@ai-sdk/provider-utils';\n\nexport function getResponseMetadata({\n id,\n model,\n created,\n}: {\n id?: string | null;\n model?: string | null;\n created?: number | null;\n}) {\n return createLanguageModelResponseMetadata({\n id,\n model,\n // Some OpenAI-compatible providers use 0 as a placeholder timestamp.\n created: created || undefined,\n });\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapOpenAICompatibleFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import { z } from 'zod/v4';\n\nexport type OpenAICompatibleChatModelId = string;\n\nexport const openaiCompatibleLanguageModelChatOptions = z.object({\n /**\n * A unique identifier representing your end-user, which can help the provider to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`.\n */\n reasoningEffort: z.string().optional(),\n\n /**\n * Controls the verbosity of the generated text. Defaults to `medium`.\n */\n textVerbosity: z.string().optional(),\n\n /**\n * Whether to use strict JSON schema validation.\n * When true, the model uses constrained decoding to guarantee schema compliance.\n * Only used when the provider supports structured outputs and a schema is provided.\n *\n * @default true\n */\n strictJsonSchema: z.boolean().optional(),\n});\n\nexport type OpenAICompatibleLanguageModelChatOptions = z.infer<\n typeof openaiCompatibleLanguageModelChatOptions\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n }> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...(tool.strict != null ? { strict: tool.strict } : {}),\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","import {\n InvalidResponseDataError,\n type APICallError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4FinishReason,\n type LanguageModelV4GenerateResult,\n type LanguageModelV4StreamPart,\n type LanguageModelV4StreamResult,\n type LanguageModelV4Usage,\n type SharedV4ProviderMetadata,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolve,\n lazySchema,\n zodSchema,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type StreamingToolCallDelta,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n resolveProviderOptionsKey,\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleChatUsage } from './convert-openai-compatible-chat-usage';\nimport { convertToOpenAICompatibleChatMessages } from './convert-to-openai-compatible-chat-messages';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelChatOptions,\n type OpenAICompatibleChatModelId,\n} from './openai-compatible-chat-language-model-options';\nimport type { MetadataExtractor } from './openai-compatible-metadata-extractor';\nimport { prepareTools } from './openai-compatible-prepare-tools';\n\ntype OpenAICompatibleStreamingToolCallDelta = StreamingToolCallDelta & {\n extra_content?: {\n google?: {\n thought_signature?: string | null;\n } | null;\n } | null;\n};\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<any>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether the model supports multi-part content in tool results.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: (\n args: Record<string, any>,\n warnings?: SharedV4Warning[],\n ) => Record<string, any>;\n\n /**\n * Optional function to map the top-level `reasoning` option to the\n * `reasoning_effort` request value. It is not applied to a `reasoningEffort`\n * from provider options, which is always sent unchanged. By default, the\n * reasoning value is sent directly.\n */\n mapReasoning?: (options: {\n reasoning: Exclude<\n LanguageModelV4CallOptions['reasoning'],\n 'provider-default' | undefined\n >;\n warnings: SharedV4Warning[];\n }) => string | undefined;\n\n /**\n * Optional usage converter for OpenAI-compatible providers with different\n * token accounting semantics.\n */\n convertUsage?: (\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ) => LanguageModelV4Usage;\n};\n\ntype PendingToolCall = {\n id: string | null;\n bufferedArguments: string;\n extraContent: OpenAICompatibleStreamingToolCallDelta['extra_content'];\n};\n\nexport class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: OpenAICompatibleChatModelId;\n protected readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleChatConfig;\n }) {\n return new OpenAICompatibleChatLanguageModel(\n options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelId: OpenAICompatibleChatModelId,\n config: OpenAICompatibleChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n\n // initialize error handling:\n const errorStructure =\n config.errorStructure ?? defaultOpenAICompatibleErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(\n errorStructure.errorSchema,\n );\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure);\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private transformRequestBody(\n args: Record<string, any>,\n warnings: SharedV4Warning[],\n ): Record<string, any> {\n return this.config.transformRequestBody?.(args, warnings) ?? args;\n }\n\n private convertUsage(\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ): LanguageModelV4Usage {\n return (\n this.config.convertUsage?.(usage) ??\n convertOpenAICompatibleChatUsage(usage)\n );\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n );\n\n const strictJsonSchema = compatibleOptions?.strictJsonSchema ?? true;\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details:\n 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const metadataKey = resolveProviderOptionsKey(\n this.providerOptionsName,\n providerOptions,\n );\n\n return {\n metadataKey,\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n user: compatibleOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true &&\n responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n stop: stopSequences,\n seed,\n ...Object.fromEntries(\n Object.entries({\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n }).filter(\n ([key]) =>\n !Object.keys(\n openaiCompatibleLanguageModelChatOptions.shape,\n ).includes(key),\n ),\n ),\n\n reasoning_effort:\n compatibleOptions.reasoningEffort ??\n (isCustomReasoning(reasoning)\n ? this.config.mapReasoning != null\n ? this.config.mapReasoning({ reasoning, warnings })\n : reasoning\n : undefined),\n verbosity: compatibleOptions.textVerbosity,\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt, {\n provider: this.providerOptionsName,\n providerOptionsKey: metadataKey,\n supportsMultiPartToolContent:\n this.config.supportsMultiPartToolContent,\n }),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, metadataKey } = await this.getArgs({ ...options });\n\n const transformedBody = this.transformRequestBody(args, warnings);\n const body = JSON.stringify(transformedBody);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: transformedBody,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenAICompatibleChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n // reasoning content:\n const reasoning =\n choice.message.reasoning_content ?? choice.message.reasoning;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n content.push(...convertOpenAICompatibleContent(choice.message.content));\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n const thoughtSignature =\n toolCall.extra_content?.google?.thought_signature;\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n ...(thoughtSignature\n ? {\n providerMetadata: {\n [metadataKey]: { thoughtSignature },\n },\n }\n : {}),\n });\n }\n }\n\n // provider metadata:\n const providerMetadata: SharedV4ProviderMetadata = {\n [metadataKey]: {},\n ...(await this.config.metadataExtractor?.extractMetadata?.({\n parsedBody: rawResponse,\n })),\n };\n const completionTokenDetails =\n responseBody.usage?.completion_tokens_details;\n if (completionTokenDetails?.accepted_prediction_tokens != null) {\n providerMetadata[metadataKey].acceptedPredictionTokens =\n completionTokenDetails?.accepted_prediction_tokens;\n }\n if (completionTokenDetails?.rejected_prediction_tokens != null) {\n providerMetadata[metadataKey].rejectedPredictionTokens =\n completionTokenDetails?.rejected_prediction_tokens;\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: this.convertUsage(responseBody.usage),\n providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, metadataKey } = await this.getArgs({\n ...options,\n });\n\n const body = this.transformRequestBody(\n {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n },\n warnings,\n );\n\n const metadataExtractor =\n this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const providerOptionsName = metadataKey;\n let toolCallTracker: StreamingToolCallTracker<OpenAICompatibleStreamingToolCallDelta>;\n\n // Buffers tool-call deltas by `index` until `function.name` is known.\n // Some OpenAI-compatible providers send the first delta without\n // `function.name`, which the shared tracker rejects on first chunk.\n const pendingToolCalls = new Map<number, PendingToolCall>();\n const forwardedToolCallIndices = new Set<number>();\n\n const processToolCallDelta = (\n toolCallDelta: OpenAICompatibleStreamingToolCallDelta,\n ) => {\n const index = toolCallDelta.index;\n\n if (index == null || forwardedToolCallIndices.has(index)) {\n toolCallTracker.processDelta(toolCallDelta);\n return;\n }\n\n let pending = pendingToolCalls.get(index);\n if (pending == null) {\n pending = {\n id: toolCallDelta.id ?? null,\n bufferedArguments: '',\n extraContent: toolCallDelta.extra_content ?? null,\n };\n pendingToolCalls.set(index, pending);\n } else {\n if (pending.id == null && toolCallDelta.id != null) {\n pending.id = toolCallDelta.id;\n }\n if (\n pending.extraContent == null &&\n toolCallDelta.extra_content != null\n ) {\n pending.extraContent = toolCallDelta.extra_content;\n }\n }\n\n const argumentsDelta = toolCallDelta.function?.arguments;\n if (argumentsDelta != null) {\n pending.bufferedArguments += argumentsDelta;\n }\n\n const name = toolCallDelta.function?.name;\n if (name != null) {\n const forwardDelta: OpenAICompatibleStreamingToolCallDelta = {\n index,\n id: pending.id,\n function: {\n name,\n arguments: pending.bufferedArguments,\n },\n extra_content: pending.extraContent ?? undefined,\n };\n toolCallTracker.processDelta(forwardDelta);\n pendingToolCalls.delete(index);\n forwardedToolCallIndices.add(index);\n }\n };\n\n let finishReason: LanguageModelV4FinishReason | undefined;\n let usage:\n | z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>\n | undefined = undefined;\n let metadataExtracted = false;\n let isActiveReasoning = false;\n let isActiveText = false;\n const convertUsage = (\n usage: z.infer<ReturnType<typeof openaiCompatibleTokenUsageSchema>>,\n ) => this.convertUsage(usage);\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker =\n new StreamingToolCallTracker<OpenAICompatibleStreamingToolCallDelta>(\n controller,\n {\n generateId,\n extractMetadata: delta => {\n const thoughtSignature =\n delta.extra_content?.google?.thought_signature;\n\n return thoughtSignature\n ? { [providerOptionsName]: { thoughtSignature } }\n : undefined;\n },\n buildToolCallProviderMetadata: metadata => metadata,\n },\n );\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // handle error chunks:\n if ('error' in chunk.value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: chunk.value.error,\n });\n return;\n }\n\n // TODO we lost type safety on Chunk, most likely due to the error schema. MUST FIX\n // remove this workaround when the issue is fixed\n const value = chunk.value as z.infer<\n ReturnType<typeof chunkBaseSchema>\n >;\n\n // Extract and emit response metadata once. Usually it comes in the\n // first chunk, but some providers prepend a placeholder chunk with\n // empty metadata.\n if (!metadataExtracted) {\n const metadata = getResponseMetadata(value);\n if (Object.values(metadata).some(Boolean)) {\n metadataExtracted = true;\n controller.enqueue({\n type: 'response-metadata',\n ...metadata,\n });\n }\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n const enqueueReasoningDelta = (reasoningDelta: string) => {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n isActiveText = false;\n }\n\n if (!isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-start',\n id: 'reasoning-0',\n });\n isActiveReasoning = true;\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: reasoningDelta,\n });\n };\n\n const enqueueTextDelta = (textDelta: string) => {\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'txt-0' });\n isActiveText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'txt-0',\n delta: textDelta,\n });\n };\n\n // enqueue reasoning before text deltas:\n const reasoningContent = delta.reasoning_content ?? delta.reasoning;\n if (reasoningContent) {\n enqueueReasoningDelta(reasoningContent);\n }\n\n for (const contentPart of convertOpenAICompatibleContent(\n delta.content,\n )) {\n if (contentPart.type === 'reasoning') {\n enqueueReasoningDelta(contentPart.text);\n } else {\n enqueueTextDelta(contentPart.text);\n }\n }\n\n if (delta.tool_calls != null && delta.tool_calls.length > 0) {\n // end active reasoning block before tool calls start\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n processToolCallDelta(toolCallDelta);\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n }\n\n // Forward any tool-call deltas that never received a\n // `function.name`. The tracker will throw on the missing name,\n // preserving the original invalid-response semantics.\n for (const [index, pending] of pendingToolCalls) {\n toolCallTracker.processDelta({\n index,\n id: pending.id,\n function: { arguments: pending.bufferedArguments },\n });\n }\n pendingToolCalls.clear();\n\n toolCallTracker.flush();\n\n if (finishReason == null) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new InvalidResponseDataError({\n data: undefined,\n message: 'Response stream ended without a finish reason.',\n }),\n });\n }\n\n const providerMetadata: SharedV4ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (\n usage?.completion_tokens_details?.accepted_prediction_tokens !=\n null\n ) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage?.completion_tokens_details?.accepted_prediction_tokens;\n }\n if (\n usage?.completion_tokens_details?.rejected_prediction_tokens !=\n null\n ) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage?.completion_tokens_details?.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\n// Loose, nested objects included: the parsed value is returned as `usage.raw`.\nconst openaiCompatibleTokenUsageSchema = () =>\n z\n .looseObject({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\nconst openAICompatibleContentSchema = () =>\n z\n .union([\n z.string(),\n z.array(\n z.looseObject({\n type: z.string(),\n }),\n ),\n ])\n .nullish();\n\nfunction convertOpenAICompatibleContent(\n content: z.infer<ReturnType<typeof openAICompatibleContentSchema>>,\n): Array<Extract<LanguageModelV4Content, { type: 'text' | 'reasoning' }>> {\n if (content == null) {\n return [];\n }\n\n if (typeof content === 'string') {\n return content.length > 0 ? [{ type: 'text', text: content }] : [];\n }\n\n const result: Array<\n Extract<LanguageModelV4Content, { type: 'text' | 'reasoning' }>\n > = [];\n\n for (const part of content) {\n if (part.type === 'text' && typeof part.text === 'string') {\n if (part.text.length > 0) {\n result.push({ type: 'text', text: part.text });\n }\n } else if (part.type === 'thinking' && Array.isArray(part.thinking)) {\n const reasoningText = part.thinking\n .filter(\n chunk =>\n chunk != null &&\n typeof chunk === 'object' &&\n 'type' in chunk &&\n chunk.type === 'text' &&\n 'text' in chunk &&\n typeof chunk.text === 'string',\n )\n .map(chunk => chunk.text)\n .join('');\n\n if (reasoningText.length > 0) {\n result.push({ type: 'reasoning', text: reasoningText });\n }\n }\n }\n\n return result;\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: openAICompatibleContentSchema(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n // Support for Google Gemini thought signatures via OpenAI compatibility\n extra_content: z\n .object({\n google: z\n .object({\n thought_signature: z.string().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: openaiCompatibleTokenUsageSchema(),\n }),\n ),\n);\n\nconst chunkBaseSchema = () =>\n z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant', '']).nullish(),\n content: openAICompatibleContentSchema(),\n // Most openai-compatible models set `reasoning_content`, but some\n // providers serving `gpt-oss` set `reasoning`. See #7866\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(), //google does not send index\n id: z.string().nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n // Support for Google Gemini thought signatures via OpenAI compatibility\n extra_content: z\n .object({\n google: z\n .object({\n thought_signature: z.string().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: openaiCompatibleTokenUsageSchema(),\n });\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <\n ERROR_SCHEMA extends z.core.$ZodType,\n>(\n errorSchema: ERROR_SCHEMA,\n) => z.union([chunkBaseSchema(), errorSchema]);\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertOpenAICompatibleCompletionUsage(\n usage:\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens,\n reasoning: undefined,\n },\n raw: usage,\n };\n}\n","import {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nexport function convertToOpenAICompatibleCompletionPrompt({\n prompt,\n user = 'user',\n assistant = 'assistant',\n}: {\n prompt: LanguageModelV4Prompt;\n user?: string;\n assistant?: string;\n}): {\n prompt: string;\n stopSequences?: string[];\n} {\n // transform to a chat message format:\n let text = '';\n\n // if first message is a system message, add it to the text:\n if (prompt[0].role === 'system') {\n text += `${prompt[0].content}\\n\\n`;\n prompt = prompt.slice(1);\n }\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n throw new InvalidPromptError({\n message: `Unexpected system message in prompt: ${content}`,\n prompt,\n });\n }\n\n case 'user': {\n const userMessage = content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n }\n })\n .filter(Boolean)\n .join('');\n\n text += `${user}:\\n${userMessage}\\n\\n`;\n break;\n }\n\n case 'assistant': {\n const assistantMessage = content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-call messages',\n });\n }\n }\n })\n .join('');\n\n text += `${assistant}:\\n${assistantMessage}\\n\\n`;\n break;\n }\n\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool messages',\n });\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n // Assistant message prefix:\n text += `${assistant}:\\n`;\n\n return {\n prompt: text,\n stopSequences: [`\\n${user}:`],\n };\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapOpenAICompatibleFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type OpenAICompatibleCompletionModelId = string;\n\nexport const openaiCompatibleLanguageModelCompletionOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Echo back the prompt in addition to the completion.\n */\n echo: z.boolean().optional(),\n\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100.\n */\n logitBias: z.record(z.string(), z.number()).optional(),\n\n /**\n * The suffix that comes after a completion of inserted text.\n */\n suffix: z.string().optional(),\n\n /**\n * A unique identifier representing your end-user, which can help providers to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n }),\n ),\n);\n\nexport type OpenAICompatibleLanguageModelCompletionOptions = InferSchema<\n typeof openaiCompatibleLanguageModelCompletionOptions\n>;\n","import type {\n APICallError,\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolve,\n lazySchema,\n zodSchema,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleCompletionUsage } from './convert-openai-compatible-completion-usage';\nimport { convertToOpenAICompatibleCompletionPrompt } from './convert-to-openai-compatible-completion-prompt';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelCompletionOptions,\n type OpenAICompatibleCompletionModelId,\n} from './openai-compatible-completion-language-model-options';\ntype OpenAICompatibleCompletionConfig = {\n provider: string;\n includeUsage?: boolean;\n headers?: Resolvable<Record<string, string | undefined>>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport class OpenAICompatibleCompletionLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: OpenAICompatibleCompletionModelId;\n private readonly config: OpenAICompatibleCompletionConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleCompletionLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleCompletionConfig;\n }) {\n return new OpenAICompatibleCompletionLanguageModel(\n options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelId: OpenAICompatibleCompletionModelId,\n config: OpenAICompatibleCompletionConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n\n // initialize error handling:\n const errorStructure =\n config.errorStructure ?? defaultOpenAICompatibleErrorStructure;\n this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(\n errorStructure.errorSchema,\n );\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure);\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences: userStopSequences,\n responseFormat,\n seed,\n providerOptions,\n tools,\n toolChoice,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n // Parse provider options (support both raw and camelCase keys)\n const completionOptions = Object.assign(\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelCompletionOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelCompletionOptions,\n })) ?? {},\n );\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (tools?.length) {\n warnings.push({ type: 'unsupported', feature: 'tools' });\n }\n\n if (toolChoice != null) {\n warnings.push({ type: 'unsupported', feature: 'toolChoice' });\n }\n\n if (responseFormat != null && responseFormat.type !== 'text') {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format is not supported.',\n });\n }\n\n const { prompt: completionPrompt, stopSequences } =\n convertToOpenAICompatibleCompletionPrompt({ prompt });\n\n const stop = [...(stopSequences ?? []), ...(userStopSequences ?? [])];\n\n return {\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n echo: completionOptions.echo,\n logit_bias: completionOptions.logitBias,\n suffix: completionOptions.suffix,\n user: completionOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n\n // prompt:\n prompt: completionPrompt,\n\n // stop sequences:\n stop: stop.length > 0 ? stop : undefined,\n },\n warnings,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleCompletionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n if (choice.text != null && choice.text.length > 0) {\n content.push({ type: 'text', text: choice.text });\n }\n\n return {\n content,\n usage: convertOpenAICompatibleCompletionUsage(response.usage),\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n },\n request: { body: args },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage:\n | {\n prompt_tokens: number | undefined;\n completion_tokens: number | undefined;\n total_tokens: number | undefined;\n }\n | undefined = undefined;\n let isFirstChunk = true;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: value.error });\n return;\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n\n controller.enqueue({\n type: 'text-start',\n id: '0',\n });\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n };\n }\n\n if (choice?.text != null) {\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: choice.text,\n });\n }\n },\n\n flush(controller) {\n if (!isFirstChunk) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleCompletionUsage(usage),\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\n// Loose: the parsed value is returned as `usage.raw`.\nconst usageSchema = () =>\n z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n });\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleCompletionResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string(),\n }),\n ),\n usage: usageSchema().nullish(),\n }),\n ),\n);\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleCompletionChunkSchema = <\n ERROR_SCHEMA extends z.core.$ZodType,\n>(\n errorSchema: ERROR_SCHEMA,\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: usageSchema().nullish(),\n }),\n errorSchema,\n ]);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type OpenAICompatibleEmbeddingModelId = string;\n\nexport const openaiCompatibleEmbeddingModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in text-embedding-3 and later models.\n */\n dimensions: z.number().optional(),\n\n /**\n * A unique identifier representing your end-user, which can help providers to\n * monitor and detect abuse.\n */\n user: z.string().optional(),\n }),\n ),\n);\n\nexport type OpenAICompatibleEmbeddingModelOptions = InferSchema<\n typeof openaiCompatibleEmbeddingModelOptions\n>;\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolve,\n lazySchema,\n zodSchema,\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n openaiCompatibleEmbeddingModelOptions,\n type OpenAICompatibleEmbeddingModelId,\n} from './openai-compatible-embedding-model-options';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { warnIfDeprecatedProviderOptionsKey } from '../utils/to-camel-case';\n\ntype OpenAICompatibleEmbeddingConfig = {\n /**\n * Override the maximum number of embeddings per call.\n */\n maxEmbeddingsPerCall?: number;\n\n /**\n * Override the parallelism of embedding calls.\n */\n supportsParallelCalls?: boolean;\n\n provider: string;\n url: (options: { modelId: string; path: string }) => string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n};\n\nexport class OpenAICompatibleEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: OpenAICompatibleEmbeddingModelId;\n\n private readonly config: OpenAICompatibleEmbeddingConfig;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxEmbeddingsPerCall(): number {\n return this.config.maxEmbeddingsPerCall ?? 2048;\n }\n\n get supportsParallelCalls(): boolean {\n return this.config.supportsParallelCalls ?? true;\n }\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleEmbeddingConfig;\n }) {\n return new OpenAICompatibleEmbeddingModel(options.modelId, options.config);\n }\n\n constructor(\n modelId: OpenAICompatibleEmbeddingModelId,\n config: OpenAICompatibleEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n async doEmbed({\n values,\n dimensions,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleEmbeddingModelOptions,\n })) ?? {},\n );\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/embeddings',\n modelId: this.modelId,\n }),\n headers: combineHeaders(await resolve(this.config.headers), headers),\n body: {\n model: this.modelId,\n input: values,\n encoding_format: 'float',\n dimensions: compatibleOptions.dimensions ?? dimensions,\n user: compatibleOptions.user,\n },\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiTextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings,\n embeddings: response.data.map(item => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.prompt_tokens }\n : undefined,\n providerMetadata: response.providerMetadata,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiTextEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n data: z.array(z.object({ embedding: z.array(z.number()) })),\n usage: z.object({ prompt_tokens: z.number() }).nullish(),\n providerMetadata: z\n .record(z.string(), z.record(z.string(), z.any()))\n .optional(),\n }),\n ),\n);\n","import {\n InvalidResponseDataError,\n type ImageModelV4,\n type ImageModelV4File,\n type ImageModelV4Usage,\n type SharedV4ProviderOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n type Resolvable,\n resolve,\n lazySchema,\n zodSchema,\n type InferSchema,\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n downloadBlob,\n getFromApi,\n postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport type { OpenAICompatibleImageModelId } from './openai-compatible-image-settings';\n\nexport type OpenAICompatibleImageModelConfig = {\n provider: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n errorStructure?: ProviderErrorStructure<any>;\n _internal?: {\n currentDate?: () => Date;\n };\n};\n\nexport class OpenAICompatibleImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 10;\n readonly supportsFileInputs = undefined;\n readonly supportsMaskInputs = undefined;\n\n get provider(): string {\n return this.config.provider;\n }\n\n /**\n * The provider options key used to extract provider-specific options.\n */\n private get providerOptionsKey(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n static [WORKFLOW_SERIALIZE](model: OpenAICompatibleImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleImageModelConfig;\n }) {\n return new OpenAICompatibleImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: OpenAICompatibleImageModelId,\n private readonly config: OpenAICompatibleImageModelConfig,\n ) {}\n\n private getArgs(\n providerOptions: SharedV4ProviderOptions,\n warnings: SharedV4Warning[],\n ): Record<string, unknown> {\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsKey,\n providerOptions,\n warnings,\n });\n return {\n ...providerOptions[this.providerOptionsKey],\n ...providerOptions[toCamelCase(this.providerOptionsKey)],\n };\n }\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'This model does not support aspect ratio. Use `size` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const args = this.getArgs(providerOptions, warnings);\n const isEditing = files != null && files.length > 0;\n const url = this.config.url({\n path: isEditing ? '/images/edits' : '/images/generations',\n modelId: this.modelId,\n });\n const requestHeaders = combineHeaders(\n await resolve(this.config.headers),\n headers,\n );\n\n // Image editing mode - use form data and /images/edits endpoint\n if (isEditing) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url,\n headers: requestHeaders,\n formData: convertToFormData<OpenAICompatibleFormDataInput>({\n model: this.modelId,\n prompt,\n image: await Promise.all(files.map(file => fileToBlob(file))),\n mask: mask != null ? await fileToBlob(mask) : undefined,\n n,\n size,\n ...args,\n }),\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: await this.getImages(response.data, {\n url,\n headers,\n abortSignal,\n }),\n warnings,\n usage: mapImageUsage(response.usage),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n // Standard image generation mode - use JSON and /images/generations endpoint\n const { value: response, responseHeaders } = await postJsonToApi({\n url,\n headers: requestHeaders,\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...args,\n },\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultOpenAICompatibleErrorStructure,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: await this.getImages(response.data, {\n url,\n headers,\n abortSignal,\n }),\n warnings,\n usage: mapImageUsage(response.usage),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private async getImages(\n data: InferSchema<typeof openaiCompatibleImageResponseSchema>['data'],\n options: {\n url: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n },\n ): Promise<string[] | Uint8Array[]> {\n // Preserve base64 responses without conversion\n if (data.every(image => image.b64_json != null)) {\n return data.map(image => image.b64_json!);\n }\n\n return Promise.all(\n data.map(async image => {\n if (image.b64_json != null) {\n return convertBase64ToUint8Array(image.b64_json);\n }\n\n if (image.url == null) {\n throw new InvalidResponseDataError({\n data: image,\n message: 'Expected url in the image response',\n });\n }\n\n const { value } = await getFromApi({\n url: image.url,\n validateUrl: true,\n trustedOrigin: options.url,\n credentialedOrigin: options.url,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n });\n return value;\n }),\n );\n }\n}\n\n// Providers that omit `usage` are not warned about: many OpenAI-compatible\n// backends legitimately do not report token counts for image generation.\nfunction mapImageUsage(\n usage: InferSchema<typeof openaiCompatibleImageResponseSchema>['usage'],\n): ImageModelV4Usage | undefined {\n return usage == null\n ? undefined\n : {\n inputTokens: usage.input_tokens ?? undefined,\n outputTokens: usage.output_tokens ?? undefined,\n totalTokens: usage.total_tokens ?? undefined,\n };\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleImageResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n data: z.array(\n z\n .object({\n b64_json: z.string().nullish(),\n url: z.string().nullish(),\n })\n .refine(image => image.b64_json != null || image.url != null, {\n message: 'Expected b64_json or url in the image response',\n }),\n ),\n usage: z\n .object({\n input_tokens: z.number().nullish(),\n output_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\ntype OpenAICompatibleFormDataInput = {\n model: string;\n prompt: string | undefined;\n image: Blob | Blob[];\n mask?: Blob;\n n: number;\n size: `${number}x${number}` | undefined;\n [key: string]: unknown;\n};\n\nasync function fileToBlob(file: ImageModelV4File): Promise<Blob> {\n if (file.type === 'url') {\n return downloadBlob(file.url);\n }\n\n const data =\n file.data instanceof Uint8Array\n ? file.data\n : convertBase64ToUint8Array(file.data);\n\n return new Blob([data as BlobPart], { type: file.mediaType });\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import type {\n EmbeddingModelV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n resolveWith,\n type Resolvable,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n OpenAICompatibleChatLanguageModel,\n type OpenAICompatibleChatConfig,\n} from './chat/openai-compatible-chat-language-model';\nimport type { MetadataExtractor } from './chat/openai-compatible-metadata-extractor';\nimport { OpenAICompatibleCompletionLanguageModel } from './completion/openai-compatible-completion-language-model';\nimport { OpenAICompatibleEmbeddingModel } from './embedding/openai-compatible-embedding-model';\nimport { OpenAICompatibleImageModel } from './image/openai-compatible-image-model';\nimport { VERSION } from './version';\n\nexport interface OpenAICompatibleProvider<\n CHAT_MODEL_IDS extends string = string,\n COMPLETION_MODEL_IDS extends string = string,\n EMBEDDING_MODEL_IDS extends string = string,\n IMAGE_MODEL_IDS extends string = string,\n> extends ProviderV4 {\n (modelId: CHAT_MODEL_IDS): LanguageModelV4;\n\n languageModel(\n modelId: CHAT_MODEL_IDS,\n config?: Partial<OpenAICompatibleChatConfig>,\n ): LanguageModelV4;\n\n chatModel(modelId: CHAT_MODEL_IDS): LanguageModelV4;\n\n completionModel(modelId: COMPLETION_MODEL_IDS): LanguageModelV4;\n\n embeddingModel(modelId: EMBEDDING_MODEL_IDS): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: EMBEDDING_MODEL_IDS): EmbeddingModelV4;\n\n imageModel(modelId: IMAGE_MODEL_IDS): ImageModelV4;\n}\n\nexport interface OpenAICompatibleProviderSettings {\n /**\n * Base URL for the API calls.\n */\n baseURL: string;\n\n /**\n * Provider name.\n */\n name: string;\n\n /**\n * API key for authenticating requests. If specified, adds an `Authorization`\n * header to request headers with the value `Bearer <apiKey>`. This will be added\n * before any headers potentially specified in the `headers` option.\n * A function is called before each request and may return a promise.\n */\n apiKey?: Resolvable<string>;\n\n /**\n * Optional custom headers to include in requests. These will be added to request headers\n * after any headers potentially added by use of the `apiKey` option.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional custom url query parameters to include in request urls.\n */\n queryParams?: 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 * Include usage information in streaming responses.\n */\n includeUsage?: boolean;\n\n /**\n * Whether the provider supports structured outputs in chat models.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether chat models support multi-part content in tool results.\n *\n * Enable this for providers that extend the OpenAI Chat Completions API with\n * structured tool-result content. Defaults to `false`.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: OpenAICompatibleChatConfig['transformRequestBody'];\n\n /**\n * Optional metadata extractor to capture provider-specific metadata from API responses.\n * This is useful for extracting non-standard fields, experimental features,\n * or provider-specific metrics from both streaming and non-streaming responses.\n */\n metadataExtractor?: MetadataExtractor;\n\n /**\n * The supported URLs for chat models.\n */\n supportedUrls?: OpenAICompatibleChatConfig['supportedUrls'];\n\n /**\n * Optional usage converter for providers with token accounting semantics that\n * differ from the default OpenAI-compatible shape.\n */\n convertUsage?: OpenAICompatibleChatConfig['convertUsage'];\n}\n\n/**\n * Create an OpenAICompatible provider instance.\n */\nexport function createOpenAICompatible<\n CHAT_MODEL_IDS extends string,\n COMPLETION_MODEL_IDS extends string,\n EMBEDDING_MODEL_IDS extends string,\n IMAGE_MODEL_IDS extends string,\n>(\n options: OpenAICompatibleProviderSettings,\n): OpenAICompatibleProvider<\n CHAT_MODEL_IDS,\n COMPLETION_MODEL_IDS,\n EMBEDDING_MODEL_IDS,\n IMAGE_MODEL_IDS\n> {\n const baseURL = withoutTrailingSlash(options.baseURL);\n const providerName = options.name;\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: Resolvable<Record<string, string>>;\n fetch?: FetchFunction;\n }\n\n const configuredApiKey = options.apiKey;\n const headers = { ...options.headers };\n\n const getHeaders = () =>\n resolveWith(configuredApiKey, apiKey =>\n withUserAgentSuffix(\n { ...(apiKey && { Authorization: `Bearer ${apiKey}` }), ...headers },\n `ai-sdk-openai-compatible/${VERSION}`,\n ),\n );\n\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `${providerName}.${modelType}`,\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createLanguageModel = (modelId: CHAT_MODEL_IDS) =>\n createChatModel(modelId);\n\n const createChatModel = (modelId: CHAT_MODEL_IDS) =>\n new OpenAICompatibleChatLanguageModel(modelId, {\n ...getCommonModelConfig('chat'),\n includeUsage: options.includeUsage,\n supportsStructuredOutputs: options.supportsStructuredOutputs,\n supportsMultiPartToolContent: options.supportsMultiPartToolContent,\n supportedUrls: options.supportedUrls,\n transformRequestBody: options.transformRequestBody,\n metadataExtractor: options.metadataExtractor,\n convertUsage: options.convertUsage,\n });\n\n const createCompletionModel = (modelId: COMPLETION_MODEL_IDS) =>\n new OpenAICompatibleCompletionLanguageModel(modelId, {\n ...getCommonModelConfig('completion'),\n includeUsage: options.includeUsage,\n });\n\n const createEmbeddingModel = (modelId: EMBEDDING_MODEL_IDS) =>\n new OpenAICompatibleEmbeddingModel(modelId, {\n ...getCommonModelConfig('embedding'),\n });\n\n const createImageModel = (modelId: IMAGE_MODEL_IDS) =>\n new OpenAICompatibleImageModel(modelId, getCommonModelConfig('image'));\n\n const provider = (modelId: CHAT_MODEL_IDS) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createChatModel;\n provider.completionModel = createCompletionModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.imageModel = createImageModel;\n\n return provider as OpenAICompatibleProvider<\n CHAT_MODEL_IDS,\n COMPLETION_MODEL_IDS,\n EMBEDDING_MODEL_IDS,\n IMAGE_MODEL_IDS\n >;\n}\n"],"mappings":"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"}
|
package/dist/internal/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JSONValue, LanguageModelV4, LanguageModelV4CallOptions, LanguageModelV4FinishReason, LanguageModelV4Prompt, LanguageModelV4Usage, SharedV4ProviderMetadata, SharedV4Warning } from "@ai-sdk/provider";
|
|
2
|
-
import { FetchFunction } from "@ai-sdk/provider-utils";
|
|
2
|
+
import { FetchFunction, Resolvable } from "@ai-sdk/provider-utils";
|
|
3
3
|
import { ZodType, z } from "zod/v4";
|
|
4
4
|
//#region src/chat/openai-compatible-api-types.d.ts
|
|
5
5
|
type OpenAICompatibleChatPrompt = Array<OpenAICompatibleMessage>;
|
|
@@ -181,7 +181,7 @@ type MetadataExtractor = {
|
|
|
181
181
|
//#region src/chat/openai-compatible-chat-language-model.d.ts
|
|
182
182
|
type OpenAICompatibleChatConfig = {
|
|
183
183
|
provider: string;
|
|
184
|
-
headers?:
|
|
184
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
185
185
|
url: (options: {
|
|
186
186
|
modelId: string;
|
|
187
187
|
path: string;
|
|
@@ -209,6 +209,16 @@ type OpenAICompatibleChatConfig = {
|
|
|
209
209
|
* The optional warnings array can be used to report request transformations.
|
|
210
210
|
*/
|
|
211
211
|
transformRequestBody?: (args: Record<string, any>, warnings?: SharedV4Warning[]) => Record<string, any>;
|
|
212
|
+
/**
|
|
213
|
+
* Optional function to map the top-level `reasoning` option to the
|
|
214
|
+
* `reasoning_effort` request value. It is not applied to a `reasoningEffort`
|
|
215
|
+
* from provider options, which is always sent unchanged. By default, the
|
|
216
|
+
* reasoning value is sent directly.
|
|
217
|
+
*/
|
|
218
|
+
mapReasoning?: (options: {
|
|
219
|
+
reasoning: Exclude<LanguageModelV4CallOptions['reasoning'], 'provider-default' | undefined>;
|
|
220
|
+
warnings: SharedV4Warning[];
|
|
221
|
+
}) => string | undefined;
|
|
212
222
|
/**
|
|
213
223
|
* Optional usage converter for OpenAI-compatible providers with different
|
|
214
224
|
* token accounting semantics.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat/openai-compatible-api-types.ts","../../src/chat/convert-to-openai-compatible-chat-messages.ts","../../src/chat/convert-openai-compatible-chat-usage.ts","../../src/chat/map-openai-compatible-finish-reason.ts","../../src/chat/get-response-metadata.ts","../../src/chat/openai-compatible-prepare-tools.ts","../../src/openai-compatible-error.ts","../../src/chat/openai-compatible-metadata-extractor.ts","../../src/chat/openai-compatible-chat-language-model.ts"],"mappings":";;;;KAEY,6BAA6B,MAAM;KAEnC,0BACR,gCACA,8BACA,mCACA;KAIC,WAAW,aAAa,eAE3B,YAAY,cAAc,IAAI;UAGf,sCAAsC;EACrD;EACA;;UAGe,oCAAoC,WAAW;EAC9D;EACA,kBAAkB,MAAM;;KAGd,8BACR,kCACA,mCACA,mCACA,wCACA;UAEa,wCAAwC;EACvD;EACA;;UAGe,yCAAyC;EACxD;EACA;IAAa;;;UAIE,yCAAyC;EACxD;EACA;IAAa;;;UAIE,8CAA8C;EAC7D;EACA;IAAe;IAAc;;;UAGd,wCAAwC;EACvD;EACA;IAAQ;IAAkB;;IAAwB;;;UAGnC,yCAAyC,WAAW;EACnE;EACA;EACA;EACA,aAAa,MAAM;;UAGJ,wCAAwC;EACvD;EACA;EACA;IACE;IACA;;;;;;EAMF;IACE;MACE;;;;UAKW,oCAAoC;EACnD;EACA,kBAAkB,MAAM;EACxB;;;;wBCmGc,sCACd,QAAQ,yBAEN,UACA,oBACA;EAEA;EACA;EACA;IAED;;;wBCpMa,iCACd;EAEM;EACA;EACA;IACE;;EAEF;IACE;;uBAKP;;;wBCfa,gCACd,0CACC;;;wBCFa,sBACd,IACA,OACA;EAEA;EACA;EACA;+BACD;;;wBCLe,eACd,OACA;EAEA,OAAO;EACP,aAAa;;EAEb,mBAEI;IACE;IACA;MACE;MACA;MACA;MACA;;;EAGR;IACM;IAAkB;MAAY;;;EAKpC,cAAc;;;;KCXJ,uBAAuB;EACjC,aAAa,QAAQ;EACrB,iBAAiB,OAAO;EACxB,eAAe,UAAU,UAAU,QAAQ;;;;;;;;;KCdjC;;;;;;;;;EASV,oBACE;IAEA;QACI,QAAQ;;;;;;;;EASd;;;;;;;IAOE,aAAa;;;;;;;;IASb,iBAAiB;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat/openai-compatible-api-types.ts","../../src/chat/convert-to-openai-compatible-chat-messages.ts","../../src/chat/convert-openai-compatible-chat-usage.ts","../../src/chat/map-openai-compatible-finish-reason.ts","../../src/chat/get-response-metadata.ts","../../src/chat/openai-compatible-prepare-tools.ts","../../src/openai-compatible-error.ts","../../src/chat/openai-compatible-metadata-extractor.ts","../../src/chat/openai-compatible-chat-language-model.ts"],"mappings":";;;;KAEY,6BAA6B,MAAM;KAEnC,0BACR,gCACA,8BACA,mCACA;KAIC,WAAW,aAAa,eAE3B,YAAY,cAAc,IAAI;UAGf,sCAAsC;EACrD;EACA;;UAGe,oCAAoC,WAAW;EAC9D;EACA,kBAAkB,MAAM;;KAGd,8BACR,kCACA,mCACA,mCACA,wCACA;UAEa,wCAAwC;EACvD;EACA;;UAGe,yCAAyC;EACxD;EACA;IAAa;;;UAIE,yCAAyC;EACxD;EACA;IAAa;;;UAIE,8CAA8C;EAC7D;EACA;IAAe;IAAc;;;UAGd,wCAAwC;EACvD;EACA;IAAQ;IAAkB;;IAAwB;;;UAGnC,yCAAyC,WAAW;EACnE;EACA;EACA;EACA,aAAa,MAAM;;UAGJ,wCAAwC;EACvD;EACA;EACA;IACE;IACA;;;;;;EAMF;IACE;MACE;;;;UAKW,oCAAoC;EACnD;EACA,kBAAkB,MAAM;EACxB;;;;wBCmGc,sCACd,QAAQ,yBAEN,UACA,oBACA;EAEA;EACA;EACA;IAED;;;wBCpMa,iCACd;EAEM;EACA;EACA;IACE;;EAEF;IACE;;uBAKP;;;wBCfa,gCACd,0CACC;;;wBCFa,sBACd,IACA,OACA;EAEA;EACA;EACA;+BACD;;;wBCLe,eACd,OACA;EAEA,OAAO;EACP,aAAa;;EAEb,mBAEI;IACE;IACA;MACE;MACA;MACA;MACA;;;EAGR;IACM;IAAkB;MAAY;;;EAKpC,cAAc;;;;KCXJ,uBAAuB;EACjC,aAAa,QAAQ;EACrB,iBAAiB,OAAO;EACxB,eAAe,UAAU,UAAU,QAAQ;;;;;;;;;KCdjC;;;;;;;;;EASV,oBACE;IAEA;QACI,QAAQ;;;;;;;;EASd;;;;;;;IAOE,aAAa;;;;;;;;IASb,iBAAiB;;;;;KCoBT;EACV;EACA,UAAU,WAAW;EACrB,MAAM;IAAW;IAAiB;;EAClC,QAAQ;EACR;EACA,iBAAiB;EACjB,oBAAoB;;;;EAKpB;;;;EAKA;;;;EAKA,sBAAsB;;;;;;;EAQtB,wBACE,MAAM,qBACN,WAAW,sBACR;;;;;;;EAQL,gBAAgB;IACd,WAAW,QACT;IAGF,UAAU;;;;;;EAOZ,gBACE,OAAO,EAAE,MAAM,kBAAkB,uCAC9B;;cA2rBD,wCAAgC,EAAA,YAAA,EAAA,YAAA,EAAA;;;;;;;;;;;;GAmBxB,EAAA,KAAA"}
|
package/docs/index.mdx
CHANGED
|
@@ -19,6 +19,7 @@ We provide detailed documentation for the following OpenAI compatible providers:
|
|
|
19
19
|
- [Clarifai](/providers/openai-compatible-providers/clarifai)
|
|
20
20
|
- [NEAR AI Cloud](/providers/openai-compatible-providers/nearai)
|
|
21
21
|
- [TopxAI](/providers/openai-compatible-providers/topxai)
|
|
22
|
+
- [Synthorai](/providers/openai-compatible-providers/synthorai)
|
|
22
23
|
|
|
23
24
|
The general setup and provider instance creation is the same for all of these providers.
|
|
24
25
|
|
|
@@ -49,12 +50,15 @@ You can use the following optional settings to customize the provider instance:
|
|
|
49
50
|
|
|
50
51
|
Set the URL prefix for API calls.
|
|
51
52
|
|
|
52
|
-
- **apiKey**
|
|
53
|
+
- **apiKey** _string | PromiseLike<string> | (() => string | PromiseLike<string>)_
|
|
53
54
|
|
|
54
55
|
API key for authenticating requests. If specified, adds an `Authorization`
|
|
55
56
|
header to request headers with the value `Bearer <apiKey>`. This will be added
|
|
56
57
|
before any headers potentially specified in the `headers` option.
|
|
57
58
|
|
|
59
|
+
A function is called before each request and may return a promise. Use it to
|
|
60
|
+
supply refreshed credentials; a promise value resolves to the same key each time.
|
|
61
|
+
|
|
58
62
|
- **headers** _Record<string,string>_
|
|
59
63
|
|
|
60
64
|
Optional custom headers to include in requests. These will be added to request headers
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/openai-compatible",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.82",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@ai-sdk/provider": "4.0.
|
|
39
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
38
|
+
"@ai-sdk/provider": "4.0.35",
|
|
39
|
+
"@ai-sdk/provider-utils": "5.0.72"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@ai-sdk/test-server": "2.0.4",
|
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
type SharedV4Warning,
|
|
14
14
|
} from '@ai-sdk/provider';
|
|
15
15
|
import {
|
|
16
|
+
type Resolvable,
|
|
17
|
+
resolve,
|
|
16
18
|
lazySchema,
|
|
17
19
|
zodSchema,
|
|
18
20
|
combineHeaders,
|
|
@@ -63,7 +65,7 @@ type OpenAICompatibleStreamingToolCallDelta = StreamingToolCallDelta & {
|
|
|
63
65
|
|
|
64
66
|
export type OpenAICompatibleChatConfig = {
|
|
65
67
|
provider: string;
|
|
66
|
-
headers?:
|
|
68
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
67
69
|
url: (options: { modelId: string; path: string }) => string;
|
|
68
70
|
fetch?: FetchFunction;
|
|
69
71
|
includeUsage?: boolean;
|
|
@@ -96,6 +98,20 @@ export type OpenAICompatibleChatConfig = {
|
|
|
96
98
|
warnings?: SharedV4Warning[],
|
|
97
99
|
) => Record<string, any>;
|
|
98
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Optional function to map the top-level `reasoning` option to the
|
|
103
|
+
* `reasoning_effort` request value. It is not applied to a `reasoningEffort`
|
|
104
|
+
* from provider options, which is always sent unchanged. By default, the
|
|
105
|
+
* reasoning value is sent directly.
|
|
106
|
+
*/
|
|
107
|
+
mapReasoning?: (options: {
|
|
108
|
+
reasoning: Exclude<
|
|
109
|
+
LanguageModelV4CallOptions['reasoning'],
|
|
110
|
+
'provider-default' | undefined
|
|
111
|
+
>;
|
|
112
|
+
warnings: SharedV4Warning[];
|
|
113
|
+
}) => string | undefined;
|
|
114
|
+
|
|
99
115
|
/**
|
|
100
116
|
* Optional usage converter for OpenAI-compatible providers with different
|
|
101
117
|
* token accounting semantics.
|
|
@@ -323,7 +339,11 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {
|
|
|
323
339
|
|
|
324
340
|
reasoning_effort:
|
|
325
341
|
compatibleOptions.reasoningEffort ??
|
|
326
|
-
(isCustomReasoning(reasoning)
|
|
342
|
+
(isCustomReasoning(reasoning)
|
|
343
|
+
? this.config.mapReasoning != null
|
|
344
|
+
? this.config.mapReasoning({ reasoning, warnings })
|
|
345
|
+
: reasoning
|
|
346
|
+
: undefined),
|
|
327
347
|
verbosity: compatibleOptions.textVerbosity,
|
|
328
348
|
|
|
329
349
|
// messages:
|
|
@@ -359,7 +379,10 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {
|
|
|
359
379
|
path: '/chat/completions',
|
|
360
380
|
modelId: this.modelId,
|
|
361
381
|
}),
|
|
362
|
-
headers: combineHeaders(
|
|
382
|
+
headers: combineHeaders(
|
|
383
|
+
await resolve(this.config.headers),
|
|
384
|
+
options.headers,
|
|
385
|
+
),
|
|
363
386
|
body: transformedBody,
|
|
364
387
|
failedResponseHandler: this.failedResponseHandler,
|
|
365
388
|
successfulResponseHandler: createJsonResponseHandler(
|
|
@@ -476,7 +499,10 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {
|
|
|
476
499
|
path: '/chat/completions',
|
|
477
500
|
modelId: this.modelId,
|
|
478
501
|
}),
|
|
479
|
-
headers: combineHeaders(
|
|
502
|
+
headers: combineHeaders(
|
|
503
|
+
await resolve(this.config.headers),
|
|
504
|
+
options.headers,
|
|
505
|
+
),
|
|
480
506
|
body,
|
|
481
507
|
failedResponseHandler: this.failedResponseHandler,
|
|
482
508
|
successfulResponseHandler: createEventSourceResponseHandler(
|
|
@@ -10,6 +10,8 @@ import type {
|
|
|
10
10
|
SharedV4Warning,
|
|
11
11
|
} from '@ai-sdk/provider';
|
|
12
12
|
import {
|
|
13
|
+
type Resolvable,
|
|
14
|
+
resolve,
|
|
13
15
|
lazySchema,
|
|
14
16
|
zodSchema,
|
|
15
17
|
combineHeaders,
|
|
@@ -45,7 +47,7 @@ import {
|
|
|
45
47
|
type OpenAICompatibleCompletionConfig = {
|
|
46
48
|
provider: string;
|
|
47
49
|
includeUsage?: boolean;
|
|
48
|
-
headers?:
|
|
50
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
49
51
|
url: (options: { modelId: string; path: string }) => string;
|
|
50
52
|
fetch?: FetchFunction;
|
|
51
53
|
errorStructure?: ProviderErrorStructure<any>;
|
|
@@ -217,7 +219,10 @@ export class OpenAICompatibleCompletionLanguageModel implements LanguageModelV4
|
|
|
217
219
|
path: '/completions',
|
|
218
220
|
modelId: this.modelId,
|
|
219
221
|
}),
|
|
220
|
-
headers: combineHeaders(
|
|
222
|
+
headers: combineHeaders(
|
|
223
|
+
await resolve(this.config.headers),
|
|
224
|
+
options.headers,
|
|
225
|
+
),
|
|
221
226
|
body: args,
|
|
222
227
|
failedResponseHandler: this.failedResponseHandler,
|
|
223
228
|
successfulResponseHandler: createJsonResponseHandler(
|
|
@@ -272,7 +277,10 @@ export class OpenAICompatibleCompletionLanguageModel implements LanguageModelV4
|
|
|
272
277
|
path: '/completions',
|
|
273
278
|
modelId: this.modelId,
|
|
274
279
|
}),
|
|
275
|
-
headers: combineHeaders(
|
|
280
|
+
headers: combineHeaders(
|
|
281
|
+
await resolve(this.config.headers),
|
|
282
|
+
options.headers,
|
|
283
|
+
),
|
|
276
284
|
body,
|
|
277
285
|
failedResponseHandler: this.failedResponseHandler,
|
|
278
286
|
successfulResponseHandler: createEventSourceResponseHandler(
|
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
type SharedV4Warning,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import {
|
|
7
|
+
type Resolvable,
|
|
8
|
+
resolve,
|
|
7
9
|
lazySchema,
|
|
8
10
|
zodSchema,
|
|
9
11
|
combineHeaders,
|
|
@@ -40,7 +42,7 @@ type OpenAICompatibleEmbeddingConfig = {
|
|
|
40
42
|
|
|
41
43
|
provider: string;
|
|
42
44
|
url: (options: { modelId: string; path: string }) => string;
|
|
43
|
-
headers?:
|
|
45
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
44
46
|
fetch?: FetchFunction;
|
|
45
47
|
errorStructure?: ProviderErrorStructure<any>;
|
|
46
48
|
};
|
|
@@ -154,7 +156,7 @@ export class OpenAICompatibleEmbeddingModel implements EmbeddingModelV4 {
|
|
|
154
156
|
path: '/embeddings',
|
|
155
157
|
modelId: this.modelId,
|
|
156
158
|
}),
|
|
157
|
-
headers: combineHeaders(this.config.headers
|
|
159
|
+
headers: combineHeaders(await resolve(this.config.headers), headers),
|
|
158
160
|
body: {
|
|
159
161
|
model: this.modelId,
|
|
160
162
|
input: values,
|
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
warnIfDeprecatedProviderOptionsKey,
|
|
12
12
|
} from '../utils/to-camel-case';
|
|
13
13
|
import {
|
|
14
|
+
type Resolvable,
|
|
15
|
+
resolve,
|
|
14
16
|
lazySchema,
|
|
15
17
|
zodSchema,
|
|
16
18
|
type InferSchema,
|
|
@@ -39,7 +41,7 @@ import type { OpenAICompatibleImageModelId } from './openai-compatible-image-set
|
|
|
39
41
|
|
|
40
42
|
export type OpenAICompatibleImageModelConfig = {
|
|
41
43
|
provider: string;
|
|
42
|
-
headers?:
|
|
44
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
43
45
|
url: (options: { modelId: string; path: string }) => string;
|
|
44
46
|
fetch?: FetchFunction;
|
|
45
47
|
errorStructure?: ProviderErrorStructure<any>;
|
|
@@ -136,7 +138,10 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
|
|
|
136
138
|
path: isEditing ? '/images/edits' : '/images/generations',
|
|
137
139
|
modelId: this.modelId,
|
|
138
140
|
});
|
|
139
|
-
const requestHeaders = combineHeaders(
|
|
141
|
+
const requestHeaders = combineHeaders(
|
|
142
|
+
await resolve(this.config.headers),
|
|
143
|
+
headers,
|
|
144
|
+
);
|
|
140
145
|
|
|
141
146
|
// Image editing mode - use form data and /images/edits endpoint
|
|
142
147
|
if (isEditing) {
|
|
@@ -165,7 +170,7 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
|
|
|
165
170
|
return {
|
|
166
171
|
images: await this.getImages(response.data, {
|
|
167
172
|
url,
|
|
168
|
-
headers
|
|
173
|
+
headers,
|
|
169
174
|
abortSignal,
|
|
170
175
|
}),
|
|
171
176
|
warnings,
|
|
@@ -202,7 +207,7 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
|
|
|
202
207
|
return {
|
|
203
208
|
images: await this.getImages(response.data, {
|
|
204
209
|
url,
|
|
205
|
-
headers
|
|
210
|
+
headers,
|
|
206
211
|
abortSignal,
|
|
207
212
|
}),
|
|
208
213
|
warnings,
|
|
@@ -219,7 +224,7 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
|
|
|
219
224
|
data: InferSchema<typeof openaiCompatibleImageResponseSchema>['data'],
|
|
220
225
|
options: {
|
|
221
226
|
url: string;
|
|
222
|
-
headers: Record<string, string | undefined
|
|
227
|
+
headers: Record<string, string | undefined> | undefined;
|
|
223
228
|
abortSignal: AbortSignal | undefined;
|
|
224
229
|
},
|
|
225
230
|
): Promise<string[] | Uint8Array[]> {
|
|
@@ -246,7 +251,10 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
|
|
|
246
251
|
validateUrl: true,
|
|
247
252
|
trustedOrigin: options.url,
|
|
248
253
|
credentialedOrigin: options.url,
|
|
249
|
-
headers:
|
|
254
|
+
headers: combineHeaders(
|
|
255
|
+
await resolve(this.config.headers),
|
|
256
|
+
options.headers,
|
|
257
|
+
),
|
|
250
258
|
abortSignal: options.abortSignal,
|
|
251
259
|
fetch: this.config.fetch,
|
|
252
260
|
successfulResponseHandler: createBinaryResponseHandler(),
|
|
@@ -5,6 +5,8 @@ import type {
|
|
|
5
5
|
ProviderV4,
|
|
6
6
|
} from '@ai-sdk/provider';
|
|
7
7
|
import {
|
|
8
|
+
resolveWith,
|
|
9
|
+
type Resolvable,
|
|
8
10
|
withoutTrailingSlash,
|
|
9
11
|
withUserAgentSuffix,
|
|
10
12
|
type FetchFunction,
|
|
@@ -61,8 +63,9 @@ export interface OpenAICompatibleProviderSettings {
|
|
|
61
63
|
* API key for authenticating requests. If specified, adds an `Authorization`
|
|
62
64
|
* header to request headers with the value `Bearer <apiKey>`. This will be added
|
|
63
65
|
* before any headers potentially specified in the `headers` option.
|
|
66
|
+
* A function is called before each request and may return a promise.
|
|
64
67
|
*/
|
|
65
|
-
apiKey?: string
|
|
68
|
+
apiKey?: Resolvable<string>;
|
|
66
69
|
|
|
67
70
|
/**
|
|
68
71
|
* Optional custom headers to include in requests. These will be added to request headers
|
|
@@ -148,17 +151,20 @@ export function createOpenAICompatible<
|
|
|
148
151
|
interface CommonModelConfig {
|
|
149
152
|
provider: string;
|
|
150
153
|
url: ({ path }: { path: string }) => string;
|
|
151
|
-
headers:
|
|
154
|
+
headers: Resolvable<Record<string, string>>;
|
|
152
155
|
fetch?: FetchFunction;
|
|
153
156
|
}
|
|
154
157
|
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
...options.headers,
|
|
158
|
-
};
|
|
158
|
+
const configuredApiKey = options.apiKey;
|
|
159
|
+
const headers = { ...options.headers };
|
|
159
160
|
|
|
160
161
|
const getHeaders = () =>
|
|
161
|
-
|
|
162
|
+
resolveWith(configuredApiKey, apiKey =>
|
|
163
|
+
withUserAgentSuffix(
|
|
164
|
+
{ ...(apiKey && { Authorization: `Bearer ${apiKey}` }), ...headers },
|
|
165
|
+
`ai-sdk-openai-compatible/${VERSION}`,
|
|
166
|
+
),
|
|
167
|
+
);
|
|
162
168
|
|
|
163
169
|
const getCommonModelConfig = (modelType: string): CommonModelConfig => ({
|
|
164
170
|
provider: `${providerName}.${modelType}`,
|