@ai-sdk/openai-compatible 3.0.69 → 3.0.71

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,22 @@
1
1
  # @ai-sdk/openai-compatible
2
2
 
3
+ ## 3.0.71
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [0957554]
8
+ - @ai-sdk/provider@4.0.29
9
+ - @ai-sdk/provider-utils@5.0.62
10
+
11
+ ## 3.0.70
12
+
13
+ ### Patch Changes
14
+
15
+ - d6ed4b9: feat(openai-compatible): support URL-based image responses
16
+ - Updated dependencies [130e871]
17
+ - @ai-sdk/provider@4.0.28
18
+ - @ai-sdk/provider-utils@5.0.61
19
+
3
20
  ## 3.0.69
4
21
 
5
22
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -283,6 +283,7 @@ export declare class OpenAICompatibleImageModel implements ImageModelV4 {
283
283
  constructor(modelId: OpenAICompatibleImageModelId, config: OpenAICompatibleImageModelConfig);
284
284
  private getArgs;
285
285
  doGenerate({ prompt, n, size, aspectRatio, seed, providerOptions, headers, abortSignal, files, mask }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>>;
286
+ private getImages;
286
287
  }
287
288
  //#endregion
288
289
  //#region src/image/openai-compatible-image-model-options.d.ts
@@ -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, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, downloadBlob, generateId, getTopLevelMediaType, isCustomReasoning, parseProviderOptions, postFormDataToApi, postJsonToApi, resolveFullMediaType, resolveProviderReference, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash } 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, parseProviderOptions, postFormDataToApi, postJsonToApi, resolveFullMediaType, resolveProviderReference, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash } 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) {
@@ -1341,13 +1341,16 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1341
1341
  });
1342
1342
  const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
1343
1343
  const args = this.getArgs(providerOptions, warnings);
1344
- if (files != null && files.length > 0) {
1344
+ const isEditing = files != null && files.length > 0;
1345
+ const url = this.config.url({
1346
+ path: isEditing ? "/images/edits" : "/images/generations",
1347
+ modelId: this.modelId
1348
+ });
1349
+ const requestHeaders = combineHeaders(this.config.headers?.(), headers);
1350
+ if (isEditing) {
1345
1351
  const { value: response, responseHeaders } = await postFormDataToApi({
1346
- url: this.config.url({
1347
- path: "/images/edits",
1348
- modelId: this.modelId
1349
- }),
1350
- headers: combineHeaders(this.config.headers?.(), headers),
1352
+ url,
1353
+ headers: requestHeaders,
1351
1354
  formData: convertToFormData({
1352
1355
  model: this.modelId,
1353
1356
  prompt,
@@ -1363,7 +1366,11 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1363
1366
  fetch: this.config.fetch
1364
1367
  });
1365
1368
  return {
1366
- images: response.data.map((item) => item.b64_json),
1369
+ images: await this.getImages(response.data, {
1370
+ url,
1371
+ headers: requestHeaders,
1372
+ abortSignal
1373
+ }),
1367
1374
  warnings,
1368
1375
  usage: mapImageUsage(response.usage),
1369
1376
  response: {
@@ -1374,11 +1381,8 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1374
1381
  };
1375
1382
  }
1376
1383
  const { value: response, responseHeaders } = await postJsonToApi({
1377
- url: this.config.url({
1378
- path: "/images/generations",
1379
- modelId: this.modelId
1380
- }),
1381
- headers: combineHeaders(this.config.headers?.(), headers),
1384
+ url,
1385
+ headers: requestHeaders,
1382
1386
  body: {
1383
1387
  model: this.modelId,
1384
1388
  prompt,
@@ -1392,7 +1396,11 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1392
1396
  fetch: this.config.fetch
1393
1397
  });
1394
1398
  return {
1395
- images: response.data.map((item) => item.b64_json),
1399
+ images: await this.getImages(response.data, {
1400
+ url,
1401
+ headers: requestHeaders,
1402
+ abortSignal
1403
+ }),
1396
1404
  warnings,
1397
1405
  usage: mapImageUsage(response.usage),
1398
1406
  response: {
@@ -1402,6 +1410,28 @@ var OpenAICompatibleImageModel = class OpenAICompatibleImageModel {
1402
1410
  }
1403
1411
  };
1404
1412
  }
1413
+ async getImages(data, options) {
1414
+ if (data.every((image) => image.b64_json != null)) return data.map((image) => image.b64_json);
1415
+ return Promise.all(data.map(async (image) => {
1416
+ if (image.b64_json != null) return convertBase64ToUint8Array(image.b64_json);
1417
+ if (image.url == null) throw new InvalidResponseDataError({
1418
+ data: image,
1419
+ message: "Expected url in the image response"
1420
+ });
1421
+ const { value } = await getFromApi({
1422
+ url: image.url,
1423
+ validateUrl: true,
1424
+ trustedOrigin: options.url,
1425
+ credentialedOrigin: options.url,
1426
+ headers: options.headers,
1427
+ abortSignal: options.abortSignal,
1428
+ fetch: this.config.fetch,
1429
+ successfulResponseHandler: createBinaryResponseHandler(),
1430
+ failedResponseHandler: createStatusCodeErrorResponseHandler()
1431
+ });
1432
+ return value;
1433
+ }));
1434
+ }
1405
1435
  };
1406
1436
  function mapImageUsage(usage) {
1407
1437
  return usage == null ? void 0 : {
@@ -1411,7 +1441,10 @@ function mapImageUsage(usage) {
1411
1441
  };
1412
1442
  }
1413
1443
  const openaiCompatibleImageResponseSchema = z.object({
1414
- data: z.array(z.object({ b64_json: z.string() })),
1444
+ data: z.array(z.object({
1445
+ b64_json: z.string().nullish(),
1446
+ url: z.string().nullish()
1447
+ }).refine((image) => image.b64_json != null || image.url != null, { message: "Expected b64_json or url in the image response" })),
1415
1448
  usage: z.object({
1416
1449
  input_tokens: z.number().nullish(),
1417
1450
  output_tokens: z.number().nullish(),
@@ -1425,7 +1458,7 @@ async function fileToBlob(file) {
1425
1458
  }
1426
1459
  //#endregion
1427
1460
  //#region src/version.ts
1428
- const VERSION = "3.0.69";
1461
+ const VERSION = "3.0.71";
1429
1462
  //#endregion
1430
1463
  //#region src/openai-compatible-provider.ts
1431
1464
  /**
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 combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type StreamingToolCallDelta,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n resolveProviderOptionsKey,\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleChatUsage } from './convert-openai-compatible-chat-usage';\nimport { convertToOpenAICompatibleChatMessages } from './convert-to-openai-compatible-chat-messages';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelChatOptions,\n type OpenAICompatibleChatModelId,\n} from './openai-compatible-chat-language-model-options';\nimport type { MetadataExtractor } from './openai-compatible-metadata-extractor';\nimport { prepareTools } from './openai-compatible-prepare-tools';\n\ntype OpenAICompatibleStreamingToolCallDelta = StreamingToolCallDelta & {\n extra_content?: {\n google?: {\n thought_signature?: string | null;\n } | null;\n } | null;\n};\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<any>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether the model supports multi-part content in tool results.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: (\n args: Record<string, any>,\n warnings?: SharedV4Warning[],\n ) => Record<string, any>;\n\n /**\n * Optional usage converter for OpenAI-compatible providers with different\n * token accounting semantics.\n */\n convertUsage?: (\n usage: z.infer<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<typeof openaiCompatibleTokenUsageSchema>,\n ): LanguageModelV4Usage {\n return (\n this.config.convertUsage?.(usage) ??\n convertOpenAICompatibleChatUsage(usage)\n );\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n );\n\n const strictJsonSchema = compatibleOptions?.strictJsonSchema ?? true;\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details:\n 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const metadataKey = resolveProviderOptionsKey(\n this.providerOptionsName,\n providerOptions,\n );\n\n return {\n metadataKey,\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n user: compatibleOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true &&\n responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n stop: stopSequences,\n seed,\n ...Object.fromEntries(\n Object.entries({\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n }).filter(\n ([key]) =>\n !Object.keys(\n openaiCompatibleLanguageModelChatOptions.shape,\n ).includes(key),\n ),\n ),\n\n reasoning_effort:\n compatibleOptions.reasoningEffort ??\n (isCustomReasoning(reasoning) ? reasoning : undefined),\n verbosity: compatibleOptions.textVerbosity,\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt, {\n provider: this.providerOptionsName,\n providerOptionsKey: metadataKey,\n supportsMultiPartToolContent:\n this.config.supportsMultiPartToolContent,\n }),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, metadataKey } = await this.getArgs({ ...options });\n\n const transformedBody = this.transformRequestBody(args, warnings);\n const body = JSON.stringify(transformedBody);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: transformedBody,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenAICompatibleChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n content.push(...convertOpenAICompatibleContent(choice.message.content));\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 // 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: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined =\n undefined;\n let metadataExtracted = false;\n let isActiveReasoning = false;\n let isActiveText = false;\n const convertUsage = (\n usage: z.infer<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<typeof chunkBaseSchema>;\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 = 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 = 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<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 = 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\nconst chunkBaseSchema = 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 { z } from 'zod/v4';\n\nexport type OpenAICompatibleCompletionModelId = string;\n\nexport const openaiCompatibleLanguageModelCompletionOptions = 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\nexport type OpenAICompatibleLanguageModelCompletionOptions = z.infer<\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 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 = 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 = 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// 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 { z } from 'zod/v4';\n\nexport type OpenAICompatibleEmbeddingModelId = string;\n\nexport const openaiCompatibleEmbeddingModelOptions = 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\nexport type OpenAICompatibleEmbeddingModelOptions = z.infer<\n typeof openaiCompatibleEmbeddingModelOptions\n>;\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\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 = 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","import type {\n ImageModelV4,\n ImageModelV4File,\n ImageModelV4Usage,\n SharedV4ProviderOptions,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n downloadBlob,\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\n // Image editing mode - use form data and /images/edits endpoint\n if (files != null && files.length > 0) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url: this.config.url({\n path: '/images/edits',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), headers),\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: response.data.map(item => item.b64_json),\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: this.config.url({\n path: '/images/generations',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), headers),\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: response.data.map(item => item.b64_json),\n warnings,\n usage: mapImageUsage(response.usage),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\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: z.infer<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 = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\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\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 combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type StreamingToolCallDelta,\n type FetchFunction,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n resolveProviderOptionsKey,\n toCamelCase,\n warnIfDeprecatedProviderOptionsKey,\n} from '../utils/to-camel-case';\nimport {\n defaultOpenAICompatibleErrorStructure,\n type ProviderErrorStructure,\n} from '../openai-compatible-error';\nimport { convertOpenAICompatibleChatUsage } from './convert-openai-compatible-chat-usage';\nimport { convertToOpenAICompatibleChatMessages } from './convert-to-openai-compatible-chat-messages';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { mapOpenAICompatibleFinishReason } from './map-openai-compatible-finish-reason';\nimport {\n openaiCompatibleLanguageModelChatOptions,\n type OpenAICompatibleChatModelId,\n} from './openai-compatible-chat-language-model-options';\nimport type { MetadataExtractor } from './openai-compatible-metadata-extractor';\nimport { prepareTools } from './openai-compatible-prepare-tools';\n\ntype OpenAICompatibleStreamingToolCallDelta = StreamingToolCallDelta & {\n extra_content?: {\n google?: {\n thought_signature?: string | null;\n } | null;\n } | null;\n};\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<any>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Whether the model supports multi-part content in tool results.\n */\n supportsMultiPartToolContent?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n\n /**\n * Optional function to transform the request body before sending it to the API.\n * This is useful for proxy providers that may require a different request format\n * than the official OpenAI API.\n * The optional warnings array can be used to report request transformations.\n */\n transformRequestBody?: (\n args: Record<string, any>,\n warnings?: SharedV4Warning[],\n ) => Record<string, any>;\n\n /**\n * Optional usage converter for OpenAI-compatible providers with different\n * token accounting semantics.\n */\n convertUsage?: (\n usage: z.infer<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<typeof openaiCompatibleTokenUsageSchema>,\n ): LanguageModelV4Usage {\n return (\n this.config.convertUsage?.(usage) ??\n convertOpenAICompatibleChatUsage(usage)\n );\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options - check for deprecated 'openai-compatible' key\n const deprecatedOptions = await parseProviderOptions({\n provider: 'openai-compatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'deprecated',\n setting: \"providerOptions key 'openai-compatible'\",\n message: \"Use 'openaiCompatible' instead.\",\n });\n }\n\n // Warn when the raw (non-camelCase) provider name is used\n warnIfDeprecatedProviderOptionsKey({\n rawName: this.providerOptionsName,\n providerOptions,\n warnings,\n });\n\n const compatibleOptions = Object.assign(\n deprecatedOptions ?? {},\n (await parseProviderOptions({\n provider: 'openaiCompatible',\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n (await parseProviderOptions({\n provider: toCamelCase(this.providerOptionsName),\n providerOptions,\n schema: openaiCompatibleLanguageModelChatOptions,\n })) ?? {},\n );\n\n const strictJsonSchema = compatibleOptions?.strictJsonSchema ?? true;\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details:\n 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const metadataKey = resolveProviderOptionsKey(\n this.providerOptionsName,\n providerOptions,\n );\n\n return {\n metadataKey,\n args: {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n user: compatibleOptions.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true &&\n responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n stop: stopSequences,\n seed,\n ...Object.fromEntries(\n Object.entries({\n ...providerOptions?.[this.providerOptionsName],\n ...providerOptions?.[toCamelCase(this.providerOptionsName)],\n }).filter(\n ([key]) =>\n !Object.keys(\n openaiCompatibleLanguageModelChatOptions.shape,\n ).includes(key),\n ),\n ),\n\n reasoning_effort:\n compatibleOptions.reasoningEffort ??\n (isCustomReasoning(reasoning) ? reasoning : undefined),\n verbosity: compatibleOptions.textVerbosity,\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt, {\n provider: this.providerOptionsName,\n providerOptionsKey: metadataKey,\n supportsMultiPartToolContent:\n this.config.supportsMultiPartToolContent,\n }),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, metadataKey } = await this.getArgs({ ...options });\n\n const transformedBody = this.transformRequestBody(args, warnings);\n const body = JSON.stringify(transformedBody);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: transformedBody,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenAICompatibleChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n content.push(...convertOpenAICompatibleContent(choice.message.content));\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 // 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: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined =\n undefined;\n let metadataExtracted = false;\n let isActiveReasoning = false;\n let isActiveText = false;\n const convertUsage = (\n usage: z.infer<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<typeof chunkBaseSchema>;\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 = 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 = 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<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 = 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\nconst chunkBaseSchema = 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 { z } from 'zod/v4';\n\nexport type OpenAICompatibleCompletionModelId = string;\n\nexport const openaiCompatibleLanguageModelCompletionOptions = 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\nexport type OpenAICompatibleLanguageModelCompletionOptions = z.infer<\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 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 = 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 = 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// 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 { z } from 'zod/v4';\n\nexport type OpenAICompatibleEmbeddingModelId = string;\n\nexport const openaiCompatibleEmbeddingModelOptions = 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\nexport type OpenAICompatibleEmbeddingModelOptions = z.infer<\n typeof openaiCompatibleEmbeddingModelOptions\n>;\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\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 = 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","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 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: z.infer<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: z.infer<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 = 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\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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"}
package/docs/index.mdx CHANGED
@@ -366,6 +366,11 @@ You can create image models using the `.imageModel()` factory method:
366
366
  const model = provider.imageModel('model-id');
367
367
  ```
368
368
 
369
+ Image generation and editing responses can contain base64 data (`b64_json`),
370
+ image URLs (`url`), or a mixture of both. The provider automatically downloads
371
+ URL-based images so that `image.base64` and `image.uint8Array` remain available.
372
+ When an image includes both fields, base64 data takes precedence.
373
+
369
374
  ### Basic Image Generation
370
375
 
371
376
  ```ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/openai-compatible",
3
- "version": "3.0.69",
3
+ "version": "3.0.71",
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.27",
39
- "@ai-sdk/provider-utils": "5.0.60"
38
+ "@ai-sdk/provider": "4.0.29",
39
+ "@ai-sdk/provider-utils": "5.0.62"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@ai-sdk/test-server": "2.0.4",
@@ -1,9 +1,10 @@
1
- import type {
2
- ImageModelV4,
3
- ImageModelV4File,
4
- ImageModelV4Usage,
5
- SharedV4ProviderOptions,
6
- SharedV4Warning,
1
+ import {
2
+ InvalidResponseDataError,
3
+ type ImageModelV4,
4
+ type ImageModelV4File,
5
+ type ImageModelV4Usage,
6
+ type SharedV4ProviderOptions,
7
+ type SharedV4Warning,
7
8
  } from '@ai-sdk/provider';
8
9
  import {
9
10
  toCamelCase,
@@ -13,9 +14,12 @@ import {
13
14
  combineHeaders,
14
15
  convertBase64ToUint8Array,
15
16
  convertToFormData,
17
+ createBinaryResponseHandler,
16
18
  createJsonErrorResponseHandler,
17
19
  createJsonResponseHandler,
20
+ createStatusCodeErrorResponseHandler,
18
21
  downloadBlob,
22
+ getFromApi,
19
23
  postFormDataToApi,
20
24
  postJsonToApi,
21
25
  serializeModelOptions,
@@ -124,15 +128,18 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
124
128
  const currentDate = this.config._internal?.currentDate?.() ?? new Date();
125
129
 
126
130
  const args = this.getArgs(providerOptions, warnings);
131
+ const isEditing = files != null && files.length > 0;
132
+ const url = this.config.url({
133
+ path: isEditing ? '/images/edits' : '/images/generations',
134
+ modelId: this.modelId,
135
+ });
136
+ const requestHeaders = combineHeaders(this.config.headers?.(), headers);
127
137
 
128
138
  // Image editing mode - use form data and /images/edits endpoint
129
- if (files != null && files.length > 0) {
139
+ if (isEditing) {
130
140
  const { value: response, responseHeaders } = await postFormDataToApi({
131
- url: this.config.url({
132
- path: '/images/edits',
133
- modelId: this.modelId,
134
- }),
135
- headers: combineHeaders(this.config.headers?.(), headers),
141
+ url,
142
+ headers: requestHeaders,
136
143
  formData: convertToFormData<OpenAICompatibleFormDataInput>({
137
144
  model: this.modelId,
138
145
  prompt,
@@ -153,7 +160,11 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
153
160
  });
154
161
 
155
162
  return {
156
- images: response.data.map(item => item.b64_json),
163
+ images: await this.getImages(response.data, {
164
+ url,
165
+ headers: requestHeaders,
166
+ abortSignal,
167
+ }),
157
168
  warnings,
158
169
  usage: mapImageUsage(response.usage),
159
170
  response: {
@@ -166,11 +177,8 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
166
177
 
167
178
  // Standard image generation mode - use JSON and /images/generations endpoint
168
179
  const { value: response, responseHeaders } = await postJsonToApi({
169
- url: this.config.url({
170
- path: '/images/generations',
171
- modelId: this.modelId,
172
- }),
173
- headers: combineHeaders(this.config.headers?.(), headers),
180
+ url,
181
+ headers: requestHeaders,
174
182
  body: {
175
183
  model: this.modelId,
176
184
  prompt,
@@ -189,7 +197,11 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
189
197
  });
190
198
 
191
199
  return {
192
- images: response.data.map(item => item.b64_json),
200
+ images: await this.getImages(response.data, {
201
+ url,
202
+ headers: requestHeaders,
203
+ abortSignal,
204
+ }),
193
205
  warnings,
194
206
  usage: mapImageUsage(response.usage),
195
207
  response: {
@@ -199,6 +211,48 @@ export class OpenAICompatibleImageModel implements ImageModelV4 {
199
211
  },
200
212
  };
201
213
  }
214
+
215
+ private async getImages(
216
+ data: z.infer<typeof openaiCompatibleImageResponseSchema>['data'],
217
+ options: {
218
+ url: string;
219
+ headers: Record<string, string | undefined>;
220
+ abortSignal: AbortSignal | undefined;
221
+ },
222
+ ): Promise<string[] | Uint8Array[]> {
223
+ // Preserve base64 responses without conversion
224
+ if (data.every(image => image.b64_json != null)) {
225
+ return data.map(image => image.b64_json!);
226
+ }
227
+
228
+ return Promise.all(
229
+ data.map(async image => {
230
+ if (image.b64_json != null) {
231
+ return convertBase64ToUint8Array(image.b64_json);
232
+ }
233
+
234
+ if (image.url == null) {
235
+ throw new InvalidResponseDataError({
236
+ data: image,
237
+ message: 'Expected url in the image response',
238
+ });
239
+ }
240
+
241
+ const { value } = await getFromApi({
242
+ url: image.url,
243
+ validateUrl: true,
244
+ trustedOrigin: options.url,
245
+ credentialedOrigin: options.url,
246
+ headers: options.headers,
247
+ abortSignal: options.abortSignal,
248
+ fetch: this.config.fetch,
249
+ successfulResponseHandler: createBinaryResponseHandler(),
250
+ failedResponseHandler: createStatusCodeErrorResponseHandler(),
251
+ });
252
+ return value;
253
+ }),
254
+ );
255
+ }
202
256
  }
203
257
 
204
258
  // Providers that omit `usage` are not warned about: many OpenAI-compatible
@@ -218,7 +272,16 @@ function mapImageUsage(
218
272
  // minimal version of the schema, focussed on what is needed for the implementation
219
273
  // this approach limits breakages when the API changes and increases efficiency
220
274
  const openaiCompatibleImageResponseSchema = z.object({
221
- data: z.array(z.object({ b64_json: z.string() })),
275
+ data: z.array(
276
+ z
277
+ .object({
278
+ b64_json: z.string().nullish(),
279
+ url: z.string().nullish(),
280
+ })
281
+ .refine(image => image.b64_json != null || image.url != null, {
282
+ message: 'Expected b64_json or url in the image response',
283
+ }),
284
+ ),
222
285
  usage: z
223
286
  .object({
224
287
  input_tokens: z.number().nullish(),