@ai-sdk/openai-compatible 3.0.81 → 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 CHANGED
@@ -1,5 +1,19 @@
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
+
3
17
  ## 3.0.81
4
18
 
5
19
  ### 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?: () => Record<string, string | undefined>;
77
+ headers?: Resolvable<Record<string, string | undefined>>;
78
78
  url: (options: {
79
79
  modelId: string;
80
80
  path: string;
@@ -171,7 +171,7 @@ type OpenAICompatibleLanguageModelCompletionOptions = InferSchema<typeof openaiC
171
171
  type OpenAICompatibleCompletionConfig = {
172
172
  provider: string;
173
173
  includeUsage?: boolean;
174
- headers?: () => Record<string, string | undefined>;
174
+ headers?: Resolvable<Record<string, string | undefined>>;
175
175
  url: (options: {
176
176
  modelId: string;
177
177
  path: string;
@@ -229,7 +229,7 @@ type OpenAICompatibleEmbeddingConfig = {
229
229
  modelId: string;
230
230
  path: string;
231
231
  }) => string;
232
- headers?: () => Record<string, string | undefined>;
232
+ headers?: Resolvable<Record<string, string | undefined>>;
233
233
  fetch?: FetchFunction;
234
234
  errorStructure?: ProviderErrorStructure<any>;
235
235
  };
@@ -259,7 +259,7 @@ type OpenAICompatibleImageModelId = string;
259
259
  //#region src/image/openai-compatible-image-model.d.ts
260
260
  type OpenAICompatibleImageModelConfig = {
261
261
  provider: string;
262
- headers?: () => Record<string, string | undefined>;
262
+ headers?: Resolvable<Record<string, string | undefined>>;
263
263
  url: (options: {
264
264
  modelId: string;
265
265
  path: string;
@@ -338,8 +338,9 @@ interface OpenAICompatibleProviderSettings {
338
338
  * API key for authenticating requests. If specified, adds an `Authorization`
339
339
  * header to request headers with the value `Bearer <apiKey>`. This will be added
340
340
  * before any headers potentially specified in the `headers` option.
341
+ * A function is called before each request and may return a promise.
341
342
  */
342
- apiKey?: string;
343
+ apiKey?: Resolvable<string>;
343
344
  /**
344
345
  * Optional custom headers to include in requests. These will be added to request headers
345
346
  * after any headers potentially added by use of the `apiKey` option.
@@ -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":"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"}
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) {
@@ -467,7 +467,7 @@ var OpenAICompatibleChatLanguageModel = class OpenAICompatibleChatLanguageModel
467
467
  path: "/chat/completions",
468
468
  modelId: this.modelId
469
469
  }),
470
- headers: combineHeaders(this.config.headers?.(), options.headers),
470
+ headers: combineHeaders(await resolve(this.config.headers), options.headers),
471
471
  body: transformedBody,
472
472
  failedResponseHandler: this.failedResponseHandler,
473
473
  successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),
@@ -533,7 +533,7 @@ var OpenAICompatibleChatLanguageModel = class OpenAICompatibleChatLanguageModel
533
533
  path: "/chat/completions",
534
534
  modelId: this.modelId
535
535
  }),
536
- headers: combineHeaders(this.config.headers?.(), options.headers),
536
+ headers: combineHeaders(await resolve(this.config.headers), options.headers),
537
537
  body,
538
538
  failedResponseHandler: this.failedResponseHandler,
539
539
  successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),
@@ -1025,7 +1025,7 @@ var OpenAICompatibleCompletionLanguageModel = class OpenAICompatibleCompletionLa
1025
1025
  path: "/completions",
1026
1026
  modelId: this.modelId
1027
1027
  }),
1028
- headers: combineHeaders(this.config.headers?.(), options.headers),
1028
+ headers: combineHeaders(await resolve(this.config.headers), options.headers),
1029
1029
  body: args,
1030
1030
  failedResponseHandler: this.failedResponseHandler,
1031
1031
  successfulResponseHandler: createJsonResponseHandler(openaiCompatibleCompletionResponseSchema),
@@ -1066,7 +1066,7 @@ var OpenAICompatibleCompletionLanguageModel = class OpenAICompatibleCompletionLa
1066
1066
  path: "/completions",
1067
1067
  modelId: this.modelId
1068
1068
  }),
1069
- headers: combineHeaders(this.config.headers?.(), options.headers),
1069
+ headers: combineHeaders(await resolve(this.config.headers), options.headers),
1070
1070
  body,
1071
1071
  failedResponseHandler: this.failedResponseHandler,
1072
1072
  successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),
@@ -1261,7 +1261,7 @@ var OpenAICompatibleEmbeddingModel = class OpenAICompatibleEmbeddingModel {
1261
1261
  path: "/embeddings",
1262
1262
  modelId: this.modelId
1263
1263
  }),
1264
- headers: combineHeaders(this.config.headers?.(), headers),
1264
+ headers: combineHeaders(await resolve(this.config.headers), headers),
1265
1265
  body: {
1266
1266
  model: this.modelId,
1267
1267
  input: values,
@@ -1349,7 +1349,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1349
1349
  path: isEditing ? "/images/edits" : "/images/generations",
1350
1350
  modelId: this.modelId
1351
1351
  });
1352
- const requestHeaders = combineHeaders(this.config.headers?.(), headers);
1352
+ const requestHeaders = combineHeaders(await resolve(this.config.headers), headers);
1353
1353
  if (isEditing) {
1354
1354
  const { value: response, responseHeaders } = await postFormDataToApi({
1355
1355
  url,
@@ -1371,7 +1371,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1371
1371
  return {
1372
1372
  images: await this.getImages(response.data, {
1373
1373
  url,
1374
- headers: requestHeaders,
1374
+ headers,
1375
1375
  abortSignal
1376
1376
  }),
1377
1377
  warnings,
@@ -1401,7 +1401,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1401
1401
  return {
1402
1402
  images: await this.getImages(response.data, {
1403
1403
  url,
1404
- headers: requestHeaders,
1404
+ headers,
1405
1405
  abortSignal
1406
1406
  }),
1407
1407
  warnings,
@@ -1426,7 +1426,7 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1426
1426
  validateUrl: true,
1427
1427
  trustedOrigin: options.url,
1428
1428
  credentialedOrigin: options.url,
1429
- headers: options.headers,
1429
+ headers: combineHeaders(await resolve(this.config.headers), options.headers),
1430
1430
  abortSignal: options.abortSignal,
1431
1431
  fetch: this.config.fetch,
1432
1432
  successfulResponseHandler: createBinaryResponseHandler(),
@@ -1461,7 +1461,7 @@ async function fileToBlob(file) {
1461
1461
  }
1462
1462
  //#endregion
1463
1463
  //#region src/version.ts
1464
- const VERSION = "3.0.81";
1464
+ const VERSION = "3.0.82";
1465
1465
  //#endregion
1466
1466
  //#region src/openai-compatible-provider.ts
1467
1467
  /**
@@ -1470,11 +1470,12 @@ const VERSION = "3.0.81";
1470
1470
  function createOpenAICompatible(options) {
1471
1471
  const baseURL = withoutTrailingSlash(options.baseURL);
1472
1472
  const providerName = options.name;
1473
- const headers = {
1474
- ...options.apiKey && { Authorization: `Bearer ${options.apiKey}` },
1475
- ...options.headers
1476
- };
1477
- const getHeaders = () => withUserAgentSuffix(headers, `ai-sdk-openai-compatible/${VERSION}`);
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}`));
1478
1479
  const getCommonModelConfig = (modelType) => ({
1479
1480
  provider: `${providerName}.${modelType}`,
1480
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 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(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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"}
@@ -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?: () => Record<string, string | undefined>;
184
+ headers?: Resolvable<Record<string, string | undefined>>;
185
185
  url: (options: {
186
186
  modelId: string;
187
187
  path: string;
@@ -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;;;;;KCkBT;EACV;EACA,gBAAgB;EAChB,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;;cAqrBD,wCAAgC,EAAA,YAAA,EAAA,YAAA,EAAA;;;;;;;;;;;;GAmBxB,EAAA,KAAA"}
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
@@ -50,12 +50,15 @@ You can use the following optional settings to customize the provider instance:
50
50
 
51
51
  Set the URL prefix for API calls.
52
52
 
53
- - **apiKey** _string_
53
+ - **apiKey** _string | PromiseLike&lt;string&gt; | (() =&gt; string | PromiseLike&lt;string&gt;)_
54
54
 
55
55
  API key for authenticating requests. If specified, adds an `Authorization`
56
56
  header to request headers with the value `Bearer <apiKey>`. This will be added
57
57
  before any headers potentially specified in the `headers` option.
58
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
+
59
62
  - **headers** _Record&lt;string,string&gt;_
60
63
 
61
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.81",
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.34",
39
- "@ai-sdk/provider-utils": "5.0.71"
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?: () => Record<string, string | undefined>;
68
+ headers?: Resolvable<Record<string, string | undefined>>;
67
69
  url: (options: { modelId: string; path: string }) => string;
68
70
  fetch?: FetchFunction;
69
71
  includeUsage?: boolean;
@@ -377,7 +379,10 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {
377
379
  path: '/chat/completions',
378
380
  modelId: this.modelId,
379
381
  }),
380
- headers: combineHeaders(this.config.headers?.(), options.headers),
382
+ headers: combineHeaders(
383
+ await resolve(this.config.headers),
384
+ options.headers,
385
+ ),
381
386
  body: transformedBody,
382
387
  failedResponseHandler: this.failedResponseHandler,
383
388
  successfulResponseHandler: createJsonResponseHandler(
@@ -494,7 +499,10 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV4 {
494
499
  path: '/chat/completions',
495
500
  modelId: this.modelId,
496
501
  }),
497
- headers: combineHeaders(this.config.headers?.(), options.headers),
502
+ headers: combineHeaders(
503
+ await resolve(this.config.headers),
504
+ options.headers,
505
+ ),
498
506
  body,
499
507
  failedResponseHandler: this.failedResponseHandler,
500
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?: () => Record<string, string | undefined>;
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(this.config.headers?.(), options.headers),
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(this.config.headers?.(), options.headers),
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?: () => Record<string, string | undefined>;
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?.(), 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?: () => Record<string, string | undefined>;
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(this.config.headers?.(), headers);
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: requestHeaders,
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: requestHeaders,
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: options.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: () => Record<string, string>;
154
+ headers: Resolvable<Record<string, string>>;
152
155
  fetch?: FetchFunction;
153
156
  }
154
157
 
155
- const headers = {
156
- ...(options.apiKey && { Authorization: `Bearer ${options.apiKey}` }),
157
- ...options.headers,
158
- };
158
+ const configuredApiKey = options.apiKey;
159
+ const headers = { ...options.headers };
159
160
 
160
161
  const getHeaders = () =>
161
- withUserAgentSuffix(headers, `ai-sdk-openai-compatible/${VERSION}`);
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}`,