@ai-sdk/openai-compatible 3.0.0-beta.3 → 3.0.0-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,50 +1,57 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- OpenAICompatibleChatLanguageModel: () => OpenAICompatibleChatLanguageModel,
24
- OpenAICompatibleCompletionLanguageModel: () => OpenAICompatibleCompletionLanguageModel,
25
- OpenAICompatibleEmbeddingModel: () => OpenAICompatibleEmbeddingModel,
26
- OpenAICompatibleImageModel: () => OpenAICompatibleImageModel,
27
- VERSION: () => VERSION,
28
- createOpenAICompatible: () => createOpenAICompatible
29
- });
30
- module.exports = __toCommonJS(index_exports);
31
-
32
1
  // src/chat/openai-compatible-chat-language-model.ts
33
- var import_provider3 = require("@ai-sdk/provider");
34
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
35
- var import_v43 = require("zod/v4");
2
+ import {
3
+ combineHeaders,
4
+ createEventSourceResponseHandler,
5
+ createJsonErrorResponseHandler,
6
+ createJsonResponseHandler,
7
+ generateId,
8
+ isCustomReasoning,
9
+ parseProviderOptions,
10
+ postJsonToApi,
11
+ serializeModelOptions,
12
+ StreamingToolCallTracker,
13
+ WORKFLOW_SERIALIZE,
14
+ WORKFLOW_DESERIALIZE
15
+ } from "@ai-sdk/provider-utils";
16
+ import { z as z3 } from "zod/v4";
17
+
18
+ // src/utils/to-camel-case.ts
19
+ function toCamelCase(str) {
20
+ return str.replace(/[_-]([a-z])/g, (g) => g[1].toUpperCase());
21
+ }
22
+ function resolveProviderOptionsKey(rawName, providerOptions) {
23
+ const camelName = toCamelCase(rawName);
24
+ if (camelName !== rawName && (providerOptions == null ? void 0 : providerOptions[camelName]) != null) {
25
+ return camelName;
26
+ }
27
+ return rawName;
28
+ }
29
+ function warnIfDeprecatedProviderOptionsKey({
30
+ rawName,
31
+ providerOptions,
32
+ warnings
33
+ }) {
34
+ const camelName = toCamelCase(rawName);
35
+ if (camelName !== rawName && (providerOptions == null ? void 0 : providerOptions[rawName]) != null) {
36
+ warnings.push({
37
+ type: "deprecated",
38
+ setting: `providerOptions key '${rawName}'`,
39
+ message: `Use '${camelName}' instead.`
40
+ });
41
+ }
42
+ }
36
43
 
37
44
  // src/openai-compatible-error.ts
38
- var import_v4 = require("zod/v4");
39
- var openaiCompatibleErrorDataSchema = import_v4.z.object({
40
- error: import_v4.z.object({
41
- message: import_v4.z.string(),
45
+ import { z } from "zod/v4";
46
+ var openaiCompatibleErrorDataSchema = z.object({
47
+ error: z.object({
48
+ message: z.string(),
42
49
  // The additional information below is handled loosely to support
43
50
  // OpenAI-compatible providers that have slightly different error
44
51
  // responses:
45
- type: import_v4.z.string().nullish(),
46
- param: import_v4.z.any().nullish(),
47
- code: import_v4.z.union([import_v4.z.string(), import_v4.z.number()]).nullish()
52
+ type: z.string().nullish(),
53
+ param: z.any().nullish(),
54
+ code: z.union([z.string(), z.number()]).nullish()
48
55
  })
49
56
  });
50
57
  var defaultOpenAICompatibleErrorStructure = {
@@ -92,8 +99,14 @@ function convertOpenAICompatibleChatUsage(usage) {
92
99
  }
93
100
 
94
101
  // src/chat/convert-to-openai-compatible-chat-messages.ts
95
- var import_provider = require("@ai-sdk/provider");
96
- var import_provider_utils = require("@ai-sdk/provider-utils");
102
+ import {
103
+ UnsupportedFunctionalityError
104
+ } from "@ai-sdk/provider";
105
+ import {
106
+ convertBase64ToUint8Array,
107
+ convertToBase64,
108
+ isProviderReference
109
+ } from "@ai-sdk/provider-utils";
97
110
  function getOpenAIMetadata(message) {
98
111
  var _a, _b;
99
112
  return (_b = (_a = message == null ? void 0 : message.providerOptions) == null ? void 0 : _a.openaiCompatible) != null ? _b : {};
@@ -138,32 +151,37 @@ function convertToOpenAICompatibleChatMessages(prompt) {
138
151
  return { type: "text", text: part.text, ...partMetadata };
139
152
  }
140
153
  case "file": {
154
+ if (isProviderReference(part.data)) {
155
+ throw new UnsupportedFunctionalityError({
156
+ functionality: "file parts with provider references"
157
+ });
158
+ }
141
159
  if (part.mediaType.startsWith("image/")) {
142
160
  const mediaType = part.mediaType === "image/*" ? "image/jpeg" : part.mediaType;
143
161
  return {
144
162
  type: "image_url",
145
163
  image_url: {
146
- url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${(0, import_provider_utils.convertToBase64)(part.data)}`
164
+ url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${convertToBase64(part.data)}`
147
165
  },
148
166
  ...partMetadata
149
167
  };
150
168
  }
151
169
  if (part.mediaType.startsWith("audio/")) {
152
170
  if (part.data instanceof URL) {
153
- throw new import_provider.UnsupportedFunctionalityError({
171
+ throw new UnsupportedFunctionalityError({
154
172
  functionality: "audio file parts with URLs"
155
173
  });
156
174
  }
157
175
  const format = getAudioFormat(part.mediaType);
158
176
  if (format === null) {
159
- throw new import_provider.UnsupportedFunctionalityError({
177
+ throw new UnsupportedFunctionalityError({
160
178
  functionality: `audio media type ${part.mediaType}`
161
179
  });
162
180
  }
163
181
  return {
164
182
  type: "input_audio",
165
183
  input_audio: {
166
- data: (0, import_provider_utils.convertToBase64)(part.data),
184
+ data: convertToBase64(part.data),
167
185
  format
168
186
  },
169
187
  ...partMetadata
@@ -171,7 +189,7 @@ function convertToOpenAICompatibleChatMessages(prompt) {
171
189
  }
172
190
  if (part.mediaType === "application/pdf") {
173
191
  if (part.data instanceof URL) {
174
- throw new import_provider.UnsupportedFunctionalityError({
192
+ throw new UnsupportedFunctionalityError({
175
193
  functionality: "PDF file parts with URLs"
176
194
  });
177
195
  }
@@ -179,14 +197,14 @@ function convertToOpenAICompatibleChatMessages(prompt) {
179
197
  type: "file",
180
198
  file: {
181
199
  filename: (_a2 = part.filename) != null ? _a2 : "document.pdf",
182
- file_data: `data:application/pdf;base64,${(0, import_provider_utils.convertToBase64)(part.data)}`
200
+ file_data: `data:application/pdf;base64,${convertToBase64(part.data)}`
183
201
  },
184
202
  ...partMetadata
185
203
  };
186
204
  }
187
205
  if (part.mediaType.startsWith("text/")) {
188
206
  const textContent = part.data instanceof URL ? part.data.toString() : typeof part.data === "string" ? new TextDecoder().decode(
189
- (0, import_provider_utils.convertBase64ToUint8Array)(part.data)
207
+ convertBase64ToUint8Array(part.data)
190
208
  ) : new TextDecoder().decode(part.data);
191
209
  return {
192
210
  type: "text",
@@ -194,7 +212,7 @@ function convertToOpenAICompatibleChatMessages(prompt) {
194
212
  ...partMetadata
195
213
  };
196
214
  }
197
- throw new import_provider.UnsupportedFunctionalityError({
215
+ throw new UnsupportedFunctionalityError({
198
216
  functionality: `file part media type ${part.mediaType}`
199
217
  });
200
218
  }
@@ -244,7 +262,7 @@ function convertToOpenAICompatibleChatMessages(prompt) {
244
262
  }
245
263
  messages.push({
246
264
  role: "assistant",
247
- content: text,
265
+ content: text || null,
248
266
  ...reasoning.length > 0 ? { reasoning_content: reasoning } : {},
249
267
  tool_calls: toolCalls.length > 0 ? toolCalls : void 0,
250
268
  ...metadata
@@ -322,21 +340,21 @@ function mapOpenAICompatibleFinishReason(finishReason) {
322
340
  }
323
341
 
324
342
  // src/chat/openai-compatible-chat-options.ts
325
- var import_v42 = require("zod/v4");
326
- var openaiCompatibleLanguageModelChatOptions = import_v42.z.object({
343
+ import { z as z2 } from "zod/v4";
344
+ var openaiCompatibleLanguageModelChatOptions = z2.object({
327
345
  /**
328
346
  * A unique identifier representing your end-user, which can help the provider to
329
347
  * monitor and detect abuse.
330
348
  */
331
- user: import_v42.z.string().optional(),
349
+ user: z2.string().optional(),
332
350
  /**
333
351
  * Reasoning effort for reasoning models. Defaults to `medium`.
334
352
  */
335
- reasoningEffort: import_v42.z.string().optional(),
353
+ reasoningEffort: z2.string().optional(),
336
354
  /**
337
355
  * Controls the verbosity of the generated text. Defaults to `medium`.
338
356
  */
339
- textVerbosity: import_v42.z.string().optional(),
357
+ textVerbosity: z2.string().optional(),
340
358
  /**
341
359
  * Whether to use strict JSON schema validation.
342
360
  * When true, the model uses constrained decoding to guarantee schema compliance.
@@ -344,11 +362,13 @@ var openaiCompatibleLanguageModelChatOptions = import_v42.z.object({
344
362
  *
345
363
  * @default true
346
364
  */
347
- strictJsonSchema: import_v42.z.boolean().optional()
365
+ strictJsonSchema: z2.boolean().optional()
348
366
  });
349
367
 
350
368
  // src/chat/openai-compatible-prepare-tools.ts
351
- var import_provider2 = require("@ai-sdk/provider");
369
+ import {
370
+ UnsupportedFunctionalityError as UnsupportedFunctionalityError2
371
+ } from "@ai-sdk/provider";
352
372
  function prepareTools({
353
373
  tools,
354
374
  toolChoice
@@ -397,7 +417,7 @@ function prepareTools({
397
417
  };
398
418
  default: {
399
419
  const _exhaustiveCheck = type;
400
- throw new import_provider2.UnsupportedFunctionalityError({
420
+ throw new UnsupportedFunctionalityError2({
401
421
  functionality: `tool choice type: ${_exhaustiveCheck}`
402
422
  });
403
423
  }
@@ -405,8 +425,7 @@ function prepareTools({
405
425
  }
406
426
 
407
427
  // src/chat/openai-compatible-chat-language-model.ts
408
- var OpenAICompatibleChatLanguageModel = class {
409
- // type inferred via constructor
428
+ var OpenAICompatibleChatLanguageModel = class _OpenAICompatibleChatLanguageModel {
410
429
  constructor(modelId, config) {
411
430
  this.specificationVersion = "v4";
412
431
  var _a, _b;
@@ -416,9 +435,22 @@ var OpenAICompatibleChatLanguageModel = class {
416
435
  this.chunkSchema = createOpenAICompatibleChatChunkSchema(
417
436
  errorStructure.errorSchema
418
437
  );
419
- this.failedResponseHandler = (0, import_provider_utils2.createJsonErrorResponseHandler)(errorStructure);
438
+ this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure);
420
439
  this.supportsStructuredOutputs = (_b = config.supportsStructuredOutputs) != null ? _b : false;
421
440
  }
441
+ // type inferred via constructor
442
+ static [WORKFLOW_SERIALIZE](model) {
443
+ return serializeModelOptions({
444
+ modelId: model.modelId,
445
+ config: model.config
446
+ });
447
+ }
448
+ static [WORKFLOW_DESERIALIZE](options) {
449
+ return new _OpenAICompatibleChatLanguageModel(
450
+ options.modelId,
451
+ options.config
452
+ );
453
+ }
422
454
  get provider() {
423
455
  return this.config.provider;
424
456
  }
@@ -441,6 +473,7 @@ var OpenAICompatibleChatLanguageModel = class {
441
473
  topK,
442
474
  frequencyPenalty,
443
475
  presencePenalty,
476
+ reasoning,
444
477
  providerOptions,
445
478
  stopSequences,
446
479
  responseFormat,
@@ -448,33 +481,44 @@ var OpenAICompatibleChatLanguageModel = class {
448
481
  toolChoice,
449
482
  tools
450
483
  }) {
451
- var _a, _b, _c, _d, _e;
484
+ var _a, _b, _c, _d, _e, _f;
452
485
  const warnings = [];
453
- const deprecatedOptions = await (0, import_provider_utils2.parseProviderOptions)({
486
+ const deprecatedOptions = await parseProviderOptions({
454
487
  provider: "openai-compatible",
455
488
  providerOptions,
456
489
  schema: openaiCompatibleLanguageModelChatOptions
457
490
  });
458
491
  if (deprecatedOptions != null) {
459
492
  warnings.push({
460
- type: "other",
461
- message: `The 'openai-compatible' key in providerOptions is deprecated. Use 'openaiCompatible' instead.`
493
+ type: "deprecated",
494
+ setting: "providerOptions key 'openai-compatible'",
495
+ message: "Use 'openaiCompatible' instead."
462
496
  });
463
497
  }
498
+ warnIfDeprecatedProviderOptionsKey({
499
+ rawName: this.providerOptionsName,
500
+ providerOptions,
501
+ warnings
502
+ });
464
503
  const compatibleOptions = Object.assign(
465
504
  deprecatedOptions != null ? deprecatedOptions : {},
466
- (_a = await (0, import_provider_utils2.parseProviderOptions)({
505
+ (_a = await parseProviderOptions({
467
506
  provider: "openaiCompatible",
468
507
  providerOptions,
469
508
  schema: openaiCompatibleLanguageModelChatOptions
470
509
  })) != null ? _a : {},
471
- (_b = await (0, import_provider_utils2.parseProviderOptions)({
510
+ (_b = await parseProviderOptions({
472
511
  provider: this.providerOptionsName,
473
512
  providerOptions,
474
513
  schema: openaiCompatibleLanguageModelChatOptions
475
- })) != null ? _b : {}
514
+ })) != null ? _b : {},
515
+ (_c = await parseProviderOptions({
516
+ provider: toCamelCase(this.providerOptionsName),
517
+ providerOptions,
518
+ schema: openaiCompatibleLanguageModelChatOptions
519
+ })) != null ? _c : {}
476
520
  );
477
- const strictJsonSchema = (_c = compatibleOptions == null ? void 0 : compatibleOptions.strictJsonSchema) != null ? _c : true;
521
+ const strictJsonSchema = (_d = compatibleOptions == null ? void 0 : compatibleOptions.strictJsonSchema) != null ? _d : true;
478
522
  if (topK != null) {
479
523
  warnings.push({ type: "unsupported", feature: "topK" });
480
524
  }
@@ -493,7 +537,12 @@ var OpenAICompatibleChatLanguageModel = class {
493
537
  tools,
494
538
  toolChoice
495
539
  });
540
+ const metadataKey = resolveProviderOptionsKey(
541
+ this.providerOptionsName,
542
+ providerOptions
543
+ );
496
544
  return {
545
+ metadataKey,
497
546
  args: {
498
547
  // model id:
499
548
  model: this.modelId,
@@ -510,22 +559,23 @@ var OpenAICompatibleChatLanguageModel = class {
510
559
  json_schema: {
511
560
  schema: responseFormat.schema,
512
561
  strict: strictJsonSchema,
513
- name: (_d = responseFormat.name) != null ? _d : "response",
562
+ name: (_e = responseFormat.name) != null ? _e : "response",
514
563
  description: responseFormat.description
515
564
  }
516
565
  } : { type: "json_object" } : void 0,
517
566
  stop: stopSequences,
518
567
  seed,
519
568
  ...Object.fromEntries(
520
- Object.entries(
521
- (_e = providerOptions == null ? void 0 : providerOptions[this.providerOptionsName]) != null ? _e : {}
522
- ).filter(
569
+ Object.entries({
570
+ ...providerOptions == null ? void 0 : providerOptions[this.providerOptionsName],
571
+ ...providerOptions == null ? void 0 : providerOptions[toCamelCase(this.providerOptionsName)]
572
+ }).filter(
523
573
  ([key]) => !Object.keys(
524
574
  openaiCompatibleLanguageModelChatOptions.shape
525
575
  ).includes(key)
526
576
  )
527
577
  ),
528
- reasoning_effort: compatibleOptions.reasoningEffort,
578
+ reasoning_effort: (_f = compatibleOptions.reasoningEffort) != null ? _f : isCustomReasoning(reasoning) && reasoning !== "none" ? reasoning : void 0,
529
579
  verbosity: compatibleOptions.textVerbosity,
530
580
  // messages:
531
581
  messages: convertToOpenAICompatibleChatMessages(prompt),
@@ -537,23 +587,23 @@ var OpenAICompatibleChatLanguageModel = class {
537
587
  };
538
588
  }
539
589
  async doGenerate(options) {
540
- var _a, _b, _c, _d, _e, _f, _g, _h;
541
- const { args, warnings } = await this.getArgs({ ...options });
590
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
591
+ const { args, warnings, metadataKey } = await this.getArgs({ ...options });
542
592
  const transformedBody = this.transformRequestBody(args);
543
593
  const body = JSON.stringify(transformedBody);
544
594
  const {
545
595
  responseHeaders,
546
596
  value: responseBody,
547
597
  rawValue: rawResponse
548
- } = await (0, import_provider_utils2.postJsonToApi)({
598
+ } = await postJsonToApi({
549
599
  url: this.config.url({
550
600
  path: "/chat/completions",
551
601
  modelId: this.modelId
552
602
  }),
553
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
603
+ headers: combineHeaders((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), options.headers),
554
604
  body: transformedBody,
555
605
  failedResponseHandler: this.failedResponseHandler,
556
- successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
606
+ successfulResponseHandler: createJsonResponseHandler(
557
607
  OpenAICompatibleChatResponseSchema
558
608
  ),
559
609
  abortSignal: options.abortSignal,
@@ -565,7 +615,7 @@ var OpenAICompatibleChatLanguageModel = class {
565
615
  if (text != null && text.length > 0) {
566
616
  content.push({ type: "text", text });
567
617
  }
568
- const reasoning = (_a = choice.message.reasoning_content) != null ? _a : choice.message.reasoning;
618
+ const reasoning = (_c = choice.message.reasoning_content) != null ? _c : choice.message.reasoning;
569
619
  if (reasoning != null && reasoning.length > 0) {
570
620
  content.push({
571
621
  type: "reasoning",
@@ -574,38 +624,38 @@ var OpenAICompatibleChatLanguageModel = class {
574
624
  }
575
625
  if (choice.message.tool_calls != null) {
576
626
  for (const toolCall of choice.message.tool_calls) {
577
- const thoughtSignature = (_c = (_b = toolCall.extra_content) == null ? void 0 : _b.google) == null ? void 0 : _c.thought_signature;
627
+ const thoughtSignature = (_e = (_d = toolCall.extra_content) == null ? void 0 : _d.google) == null ? void 0 : _e.thought_signature;
578
628
  content.push({
579
629
  type: "tool-call",
580
- toolCallId: (_d = toolCall.id) != null ? _d : (0, import_provider_utils2.generateId)(),
630
+ toolCallId: (_f = toolCall.id) != null ? _f : generateId(),
581
631
  toolName: toolCall.function.name,
582
632
  input: toolCall.function.arguments,
583
633
  ...thoughtSignature ? {
584
634
  providerMetadata: {
585
- [this.providerOptionsName]: { thoughtSignature }
635
+ [metadataKey]: { thoughtSignature }
586
636
  }
587
637
  } : {}
588
638
  });
589
639
  }
590
640
  }
591
641
  const providerMetadata = {
592
- [this.providerOptionsName]: {},
593
- ...await ((_f = (_e = this.config.metadataExtractor) == null ? void 0 : _e.extractMetadata) == null ? void 0 : _f.call(_e, {
642
+ [metadataKey]: {},
643
+ ...await ((_h = (_g = this.config.metadataExtractor) == null ? void 0 : _g.extractMetadata) == null ? void 0 : _h.call(_g, {
594
644
  parsedBody: rawResponse
595
645
  }))
596
646
  };
597
- const completionTokenDetails = (_g = responseBody.usage) == null ? void 0 : _g.completion_tokens_details;
647
+ const completionTokenDetails = (_i = responseBody.usage) == null ? void 0 : _i.completion_tokens_details;
598
648
  if ((completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens) != null) {
599
- providerMetadata[this.providerOptionsName].acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens;
649
+ providerMetadata[metadataKey].acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens;
600
650
  }
601
651
  if ((completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens) != null) {
602
- providerMetadata[this.providerOptionsName].rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens;
652
+ providerMetadata[metadataKey].rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens;
603
653
  }
604
654
  return {
605
655
  content,
606
656
  finishReason: {
607
657
  unified: mapOpenAICompatibleFinishReason(choice.finish_reason),
608
- raw: (_h = choice.finish_reason) != null ? _h : void 0
658
+ raw: (_j = choice.finish_reason) != null ? _j : void 0
609
659
  },
610
660
  usage: convertOpenAICompatibleChatUsage(responseBody.usage),
611
661
  providerMetadata,
@@ -619,8 +669,10 @@ var OpenAICompatibleChatLanguageModel = class {
619
669
  };
620
670
  }
621
671
  async doStream(options) {
622
- var _a;
623
- const { args, warnings } = await this.getArgs({ ...options });
672
+ var _a, _b, _c;
673
+ const { args, warnings, metadataKey } = await this.getArgs({
674
+ ...options
675
+ });
624
676
  const body = this.transformRequestBody({
625
677
  ...args,
626
678
  stream: true,
@@ -628,28 +680,36 @@ var OpenAICompatibleChatLanguageModel = class {
628
680
  stream_options: this.config.includeUsage ? { include_usage: true } : void 0
629
681
  });
630
682
  const metadataExtractor = (_a = this.config.metadataExtractor) == null ? void 0 : _a.createStreamExtractor();
631
- const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
683
+ const { responseHeaders, value: response } = await postJsonToApi({
632
684
  url: this.config.url({
633
685
  path: "/chat/completions",
634
686
  modelId: this.modelId
635
687
  }),
636
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
688
+ headers: combineHeaders((_c = (_b = this.config).headers) == null ? void 0 : _c.call(_b), options.headers),
637
689
  body,
638
690
  failedResponseHandler: this.failedResponseHandler,
639
- successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(
691
+ successfulResponseHandler: createEventSourceResponseHandler(
640
692
  this.chunkSchema
641
693
  ),
642
694
  abortSignal: options.abortSignal,
643
695
  fetch: this.config.fetch
644
696
  });
645
- const toolCalls = [];
697
+ const providerOptionsName = metadataKey;
698
+ const toolCallTracker = new StreamingToolCallTracker({
699
+ generateId,
700
+ extractMetadata: (delta) => {
701
+ var _a2, _b2;
702
+ const sig = (_b2 = (_a2 = delta.extra_content) == null ? void 0 : _a2.google) == null ? void 0 : _b2.thought_signature;
703
+ return sig ? { [providerOptionsName]: { thoughtSignature: sig } } : void 0;
704
+ },
705
+ buildToolCallProviderMetadata: (metadata) => metadata
706
+ });
646
707
  let finishReason = {
647
708
  unified: "other",
648
709
  raw: void 0
649
710
  };
650
711
  let usage = void 0;
651
712
  let isFirstChunk = true;
652
- const providerOptionsName = this.providerOptionsName;
653
713
  let isActiveReasoning = false;
654
714
  let isActiveText = false;
655
715
  return {
@@ -659,7 +719,7 @@ var OpenAICompatibleChatLanguageModel = class {
659
719
  controller.enqueue({ type: "stream-start", warnings });
660
720
  },
661
721
  transform(chunk, controller) {
662
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
722
+ var _a2, _b2;
663
723
  if (options.includeRawChunks) {
664
724
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
665
725
  }
@@ -699,7 +759,7 @@ var OpenAICompatibleChatLanguageModel = class {
699
759
  return;
700
760
  }
701
761
  const delta = choice.delta;
702
- const reasoningContent = (_b = delta.reasoning_content) != null ? _b : delta.reasoning;
762
+ const reasoningContent = (_b2 = delta.reasoning_content) != null ? _b2 : delta.reasoning;
703
763
  if (reasoningContent) {
704
764
  if (!isActiveReasoning) {
705
765
  controller.enqueue({
@@ -741,140 +801,31 @@ var OpenAICompatibleChatLanguageModel = class {
741
801
  isActiveReasoning = false;
742
802
  }
743
803
  for (const toolCallDelta of delta.tool_calls) {
744
- const index = (_c = toolCallDelta.index) != null ? _c : toolCalls.length;
745
- if (toolCalls[index] == null) {
746
- if (toolCallDelta.id == null) {
747
- throw new import_provider3.InvalidResponseDataError({
748
- data: toolCallDelta,
749
- message: `Expected 'id' to be a string.`
750
- });
751
- }
752
- if (((_d = toolCallDelta.function) == null ? void 0 : _d.name) == null) {
753
- throw new import_provider3.InvalidResponseDataError({
754
- data: toolCallDelta,
755
- message: `Expected 'function.name' to be a string.`
756
- });
757
- }
758
- controller.enqueue({
759
- type: "tool-input-start",
760
- id: toolCallDelta.id,
761
- toolName: toolCallDelta.function.name
762
- });
763
- toolCalls[index] = {
764
- id: toolCallDelta.id,
765
- type: "function",
766
- function: {
767
- name: toolCallDelta.function.name,
768
- arguments: (_e = toolCallDelta.function.arguments) != null ? _e : ""
769
- },
770
- hasFinished: false,
771
- thoughtSignature: (_h = (_g = (_f = toolCallDelta.extra_content) == null ? void 0 : _f.google) == null ? void 0 : _g.thought_signature) != null ? _h : void 0
772
- };
773
- const toolCall2 = toolCalls[index];
774
- if (((_i = toolCall2.function) == null ? void 0 : _i.name) != null && ((_j = toolCall2.function) == null ? void 0 : _j.arguments) != null) {
775
- if (toolCall2.function.arguments.length > 0) {
776
- controller.enqueue({
777
- type: "tool-input-delta",
778
- id: toolCall2.id,
779
- delta: toolCall2.function.arguments
780
- });
781
- }
782
- if ((0, import_provider_utils2.isParsableJson)(toolCall2.function.arguments)) {
783
- controller.enqueue({
784
- type: "tool-input-end",
785
- id: toolCall2.id
786
- });
787
- controller.enqueue({
788
- type: "tool-call",
789
- toolCallId: (_k = toolCall2.id) != null ? _k : (0, import_provider_utils2.generateId)(),
790
- toolName: toolCall2.function.name,
791
- input: toolCall2.function.arguments,
792
- ...toolCall2.thoughtSignature ? {
793
- providerMetadata: {
794
- [providerOptionsName]: {
795
- thoughtSignature: toolCall2.thoughtSignature
796
- }
797
- }
798
- } : {}
799
- });
800
- toolCall2.hasFinished = true;
801
- }
802
- }
803
- continue;
804
- }
805
- const toolCall = toolCalls[index];
806
- if (toolCall.hasFinished) {
807
- continue;
808
- }
809
- if (((_l = toolCallDelta.function) == null ? void 0 : _l.arguments) != null) {
810
- toolCall.function.arguments += (_n = (_m = toolCallDelta.function) == null ? void 0 : _m.arguments) != null ? _n : "";
811
- }
812
- controller.enqueue({
813
- type: "tool-input-delta",
814
- id: toolCall.id,
815
- delta: (_o = toolCallDelta.function.arguments) != null ? _o : ""
816
- });
817
- if (((_p = toolCall.function) == null ? void 0 : _p.name) != null && ((_q = toolCall.function) == null ? void 0 : _q.arguments) != null && (0, import_provider_utils2.isParsableJson)(toolCall.function.arguments)) {
818
- controller.enqueue({
819
- type: "tool-input-end",
820
- id: toolCall.id
821
- });
822
- controller.enqueue({
823
- type: "tool-call",
824
- toolCallId: (_r = toolCall.id) != null ? _r : (0, import_provider_utils2.generateId)(),
825
- toolName: toolCall.function.name,
826
- input: toolCall.function.arguments,
827
- ...toolCall.thoughtSignature ? {
828
- providerMetadata: {
829
- [providerOptionsName]: {
830
- thoughtSignature: toolCall.thoughtSignature
831
- }
832
- }
833
- } : {}
834
- });
835
- toolCall.hasFinished = true;
836
- }
804
+ toolCallTracker.processDelta(
805
+ toolCallDelta,
806
+ controller.enqueue.bind(controller)
807
+ );
837
808
  }
838
809
  }
839
810
  },
840
811
  flush(controller) {
841
- var _a2, _b, _c, _d, _e;
812
+ var _a2, _b2, _c2, _d;
842
813
  if (isActiveReasoning) {
843
814
  controller.enqueue({ type: "reasoning-end", id: "reasoning-0" });
844
815
  }
845
816
  if (isActiveText) {
846
817
  controller.enqueue({ type: "text-end", id: "txt-0" });
847
818
  }
848
- for (const toolCall of toolCalls.filter(
849
- (toolCall2) => !toolCall2.hasFinished
850
- )) {
851
- controller.enqueue({
852
- type: "tool-input-end",
853
- id: toolCall.id
854
- });
855
- controller.enqueue({
856
- type: "tool-call",
857
- toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils2.generateId)(),
858
- toolName: toolCall.function.name,
859
- input: toolCall.function.arguments,
860
- ...toolCall.thoughtSignature ? {
861
- providerMetadata: {
862
- [providerOptionsName]: {
863
- thoughtSignature: toolCall.thoughtSignature
864
- }
865
- }
866
- } : {}
867
- });
868
- }
819
+ toolCallTracker.flush(controller.enqueue.bind(controller));
869
820
  const providerMetadata = {
870
821
  [providerOptionsName]: {},
871
822
  ...metadataExtractor == null ? void 0 : metadataExtractor.buildMetadata()
872
823
  };
873
- if (((_b = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _b.accepted_prediction_tokens) != null) {
874
- providerMetadata[providerOptionsName].acceptedPredictionTokens = (_c = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _c.accepted_prediction_tokens;
824
+ if (((_a2 = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _a2.accepted_prediction_tokens) != null) {
825
+ providerMetadata[providerOptionsName].acceptedPredictionTokens = (_b2 = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _b2.accepted_prediction_tokens;
875
826
  }
876
- if (((_d = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _d.rejected_prediction_tokens) != null) {
877
- providerMetadata[providerOptionsName].rejectedPredictionTokens = (_e = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _e.rejected_prediction_tokens;
827
+ if (((_c2 = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _c2.rejected_prediction_tokens) != null) {
828
+ providerMetadata[providerOptionsName].rejectedPredictionTokens = (_d = usage == null ? void 0 : usage.completion_tokens_details) == null ? void 0 : _d.rejected_prediction_tokens;
878
829
  }
879
830
  controller.enqueue({
880
831
  type: "finish",
@@ -890,92 +841,102 @@ var OpenAICompatibleChatLanguageModel = class {
890
841
  };
891
842
  }
892
843
  };
893
- var openaiCompatibleTokenUsageSchema = import_v43.z.looseObject({
894
- prompt_tokens: import_v43.z.number().nullish(),
895
- completion_tokens: import_v43.z.number().nullish(),
896
- total_tokens: import_v43.z.number().nullish(),
897
- prompt_tokens_details: import_v43.z.object({
898
- cached_tokens: import_v43.z.number().nullish()
844
+ var openaiCompatibleTokenUsageSchema = z3.looseObject({
845
+ prompt_tokens: z3.number().nullish(),
846
+ completion_tokens: z3.number().nullish(),
847
+ total_tokens: z3.number().nullish(),
848
+ prompt_tokens_details: z3.object({
849
+ cached_tokens: z3.number().nullish()
899
850
  }).nullish(),
900
- completion_tokens_details: import_v43.z.object({
901
- reasoning_tokens: import_v43.z.number().nullish(),
902
- accepted_prediction_tokens: import_v43.z.number().nullish(),
903
- rejected_prediction_tokens: import_v43.z.number().nullish()
851
+ completion_tokens_details: z3.object({
852
+ reasoning_tokens: z3.number().nullish(),
853
+ accepted_prediction_tokens: z3.number().nullish(),
854
+ rejected_prediction_tokens: z3.number().nullish()
904
855
  }).nullish()
905
856
  }).nullish();
906
- var OpenAICompatibleChatResponseSchema = import_v43.z.looseObject({
907
- id: import_v43.z.string().nullish(),
908
- created: import_v43.z.number().nullish(),
909
- model: import_v43.z.string().nullish(),
910
- choices: import_v43.z.array(
911
- import_v43.z.object({
912
- message: import_v43.z.object({
913
- role: import_v43.z.literal("assistant").nullish(),
914
- content: import_v43.z.string().nullish(),
915
- reasoning_content: import_v43.z.string().nullish(),
916
- reasoning: import_v43.z.string().nullish(),
917
- tool_calls: import_v43.z.array(
918
- import_v43.z.object({
919
- id: import_v43.z.string().nullish(),
920
- function: import_v43.z.object({
921
- name: import_v43.z.string(),
922
- arguments: import_v43.z.string()
857
+ var OpenAICompatibleChatResponseSchema = z3.looseObject({
858
+ id: z3.string().nullish(),
859
+ created: z3.number().nullish(),
860
+ model: z3.string().nullish(),
861
+ choices: z3.array(
862
+ z3.object({
863
+ message: z3.object({
864
+ role: z3.literal("assistant").nullish(),
865
+ content: z3.string().nullish(),
866
+ reasoning_content: z3.string().nullish(),
867
+ reasoning: z3.string().nullish(),
868
+ tool_calls: z3.array(
869
+ z3.object({
870
+ id: z3.string().nullish(),
871
+ function: z3.object({
872
+ name: z3.string(),
873
+ arguments: z3.string()
923
874
  }),
924
875
  // Support for Google Gemini thought signatures via OpenAI compatibility
925
- extra_content: import_v43.z.object({
926
- google: import_v43.z.object({
927
- thought_signature: import_v43.z.string().nullish()
876
+ extra_content: z3.object({
877
+ google: z3.object({
878
+ thought_signature: z3.string().nullish()
928
879
  }).nullish()
929
880
  }).nullish()
930
881
  })
931
882
  ).nullish()
932
883
  }),
933
- finish_reason: import_v43.z.string().nullish()
884
+ finish_reason: z3.string().nullish()
934
885
  })
935
886
  ),
936
887
  usage: openaiCompatibleTokenUsageSchema
937
888
  });
938
- var chunkBaseSchema = import_v43.z.looseObject({
939
- id: import_v43.z.string().nullish(),
940
- created: import_v43.z.number().nullish(),
941
- model: import_v43.z.string().nullish(),
942
- choices: import_v43.z.array(
943
- import_v43.z.object({
944
- delta: import_v43.z.object({
945
- role: import_v43.z.enum(["assistant"]).nullish(),
946
- content: import_v43.z.string().nullish(),
889
+ var chunkBaseSchema = z3.looseObject({
890
+ id: z3.string().nullish(),
891
+ created: z3.number().nullish(),
892
+ model: z3.string().nullish(),
893
+ choices: z3.array(
894
+ z3.object({
895
+ delta: z3.object({
896
+ role: z3.enum(["assistant"]).nullish(),
897
+ content: z3.string().nullish(),
947
898
  // Most openai-compatible models set `reasoning_content`, but some
948
899
  // providers serving `gpt-oss` set `reasoning`. See #7866
949
- reasoning_content: import_v43.z.string().nullish(),
950
- reasoning: import_v43.z.string().nullish(),
951
- tool_calls: import_v43.z.array(
952
- import_v43.z.object({
953
- index: import_v43.z.number().nullish(),
900
+ reasoning_content: z3.string().nullish(),
901
+ reasoning: z3.string().nullish(),
902
+ tool_calls: z3.array(
903
+ z3.object({
904
+ index: z3.number().nullish(),
954
905
  //google does not send index
955
- id: import_v43.z.string().nullish(),
956
- function: import_v43.z.object({
957
- name: import_v43.z.string().nullish(),
958
- arguments: import_v43.z.string().nullish()
906
+ id: z3.string().nullish(),
907
+ function: z3.object({
908
+ name: z3.string().nullish(),
909
+ arguments: z3.string().nullish()
959
910
  }),
960
911
  // Support for Google Gemini thought signatures via OpenAI compatibility
961
- extra_content: import_v43.z.object({
962
- google: import_v43.z.object({
963
- thought_signature: import_v43.z.string().nullish()
912
+ extra_content: z3.object({
913
+ google: z3.object({
914
+ thought_signature: z3.string().nullish()
964
915
  }).nullish()
965
916
  }).nullish()
966
917
  })
967
918
  ).nullish()
968
919
  }).nullish(),
969
- finish_reason: import_v43.z.string().nullish()
920
+ finish_reason: z3.string().nullish()
970
921
  })
971
922
  ),
972
923
  usage: openaiCompatibleTokenUsageSchema
973
924
  });
974
- var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_v43.z.union([chunkBaseSchema, errorSchema]);
925
+ var createOpenAICompatibleChatChunkSchema = (errorSchema) => z3.union([chunkBaseSchema, errorSchema]);
975
926
 
976
927
  // src/completion/openai-compatible-completion-language-model.ts
977
- var import_provider_utils3 = require("@ai-sdk/provider-utils");
978
- var import_v45 = require("zod/v4");
928
+ import {
929
+ combineHeaders as combineHeaders2,
930
+ createEventSourceResponseHandler as createEventSourceResponseHandler2,
931
+ createJsonErrorResponseHandler as createJsonErrorResponseHandler2,
932
+ createJsonResponseHandler as createJsonResponseHandler2,
933
+ parseProviderOptions as parseProviderOptions2,
934
+ postJsonToApi as postJsonToApi2,
935
+ serializeModelOptions as serializeModelOptions2,
936
+ WORKFLOW_SERIALIZE as WORKFLOW_SERIALIZE2,
937
+ WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE2
938
+ } from "@ai-sdk/provider-utils";
939
+ import { z as z5 } from "zod/v4";
979
940
 
980
941
  // src/completion/convert-openai-compatible-completion-usage.ts
981
942
  function convertOpenAICompatibleCompletionUsage(usage) {
@@ -1015,7 +976,10 @@ function convertOpenAICompatibleCompletionUsage(usage) {
1015
976
  }
1016
977
 
1017
978
  // src/completion/convert-to-openai-compatible-completion-prompt.ts
1018
- var import_provider4 = require("@ai-sdk/provider");
979
+ import {
980
+ InvalidPromptError,
981
+ UnsupportedFunctionalityError as UnsupportedFunctionalityError3
982
+ } from "@ai-sdk/provider";
1019
983
  function convertToOpenAICompatibleCompletionPrompt({
1020
984
  prompt,
1021
985
  user = "user",
@@ -1031,7 +995,7 @@ function convertToOpenAICompatibleCompletionPrompt({
1031
995
  for (const { role, content } of prompt) {
1032
996
  switch (role) {
1033
997
  case "system": {
1034
- throw new import_provider4.InvalidPromptError({
998
+ throw new InvalidPromptError({
1035
999
  message: "Unexpected system message in prompt: ${content}",
1036
1000
  prompt
1037
1001
  });
@@ -1057,7 +1021,7 @@ ${userMessage}
1057
1021
  return part.text;
1058
1022
  }
1059
1023
  case "tool-call": {
1060
- throw new import_provider4.UnsupportedFunctionalityError({
1024
+ throw new UnsupportedFunctionalityError3({
1061
1025
  functionality: "tool-call messages"
1062
1026
  });
1063
1027
  }
@@ -1070,7 +1034,7 @@ ${assistantMessage}
1070
1034
  break;
1071
1035
  }
1072
1036
  case "tool": {
1073
- throw new import_provider4.UnsupportedFunctionalityError({
1037
+ throw new UnsupportedFunctionalityError3({
1074
1038
  functionality: "tool messages"
1075
1039
  });
1076
1040
  }
@@ -1120,33 +1084,32 @@ function mapOpenAICompatibleFinishReason2(finishReason) {
1120
1084
  }
1121
1085
 
1122
1086
  // src/completion/openai-compatible-completion-options.ts
1123
- var import_v44 = require("zod/v4");
1124
- var openaiCompatibleLanguageModelCompletionOptions = import_v44.z.object({
1087
+ import { z as z4 } from "zod/v4";
1088
+ var openaiCompatibleLanguageModelCompletionOptions = z4.object({
1125
1089
  /**
1126
1090
  * Echo back the prompt in addition to the completion.
1127
1091
  */
1128
- echo: import_v44.z.boolean().optional(),
1092
+ echo: z4.boolean().optional(),
1129
1093
  /**
1130
1094
  * Modify the likelihood of specified tokens appearing in the completion.
1131
1095
  *
1132
1096
  * Accepts a JSON object that maps tokens (specified by their token ID in
1133
1097
  * the GPT tokenizer) to an associated bias value from -100 to 100.
1134
1098
  */
1135
- logitBias: import_v44.z.record(import_v44.z.string(), import_v44.z.number()).optional(),
1099
+ logitBias: z4.record(z4.string(), z4.number()).optional(),
1136
1100
  /**
1137
1101
  * The suffix that comes after a completion of inserted text.
1138
1102
  */
1139
- suffix: import_v44.z.string().optional(),
1103
+ suffix: z4.string().optional(),
1140
1104
  /**
1141
1105
  * A unique identifier representing your end-user, which can help providers to
1142
1106
  * monitor and detect abuse.
1143
1107
  */
1144
- user: import_v44.z.string().optional()
1108
+ user: z4.string().optional()
1145
1109
  });
1146
1110
 
1147
1111
  // src/completion/openai-compatible-completion-language-model.ts
1148
- var OpenAICompatibleCompletionLanguageModel = class {
1149
- // type inferred via constructor
1112
+ var OpenAICompatibleCompletionLanguageModel = class _OpenAICompatibleCompletionLanguageModel {
1150
1113
  constructor(modelId, config) {
1151
1114
  this.specificationVersion = "v4";
1152
1115
  var _a;
@@ -1156,7 +1119,20 @@ var OpenAICompatibleCompletionLanguageModel = class {
1156
1119
  this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(
1157
1120
  errorStructure.errorSchema
1158
1121
  );
1159
- this.failedResponseHandler = (0, import_provider_utils3.createJsonErrorResponseHandler)(errorStructure);
1122
+ this.failedResponseHandler = createJsonErrorResponseHandler2(errorStructure);
1123
+ }
1124
+ // type inferred via constructor
1125
+ static [WORKFLOW_SERIALIZE2](model) {
1126
+ return serializeModelOptions2({
1127
+ modelId: model.modelId,
1128
+ config: model.config
1129
+ });
1130
+ }
1131
+ static [WORKFLOW_DESERIALIZE2](options) {
1132
+ return new _OpenAICompatibleCompletionLanguageModel(
1133
+ options.modelId,
1134
+ options.config
1135
+ );
1160
1136
  }
1161
1137
  get provider() {
1162
1138
  return this.config.provider;
@@ -1183,13 +1159,25 @@ var OpenAICompatibleCompletionLanguageModel = class {
1183
1159
  tools,
1184
1160
  toolChoice
1185
1161
  }) {
1186
- var _a;
1162
+ var _a, _b;
1187
1163
  const warnings = [];
1188
- const completionOptions = (_a = await (0, import_provider_utils3.parseProviderOptions)({
1189
- provider: this.providerOptionsName,
1164
+ warnIfDeprecatedProviderOptionsKey({
1165
+ rawName: this.providerOptionsName,
1190
1166
  providerOptions,
1191
- schema: openaiCompatibleLanguageModelCompletionOptions
1192
- })) != null ? _a : {};
1167
+ warnings
1168
+ });
1169
+ const completionOptions = Object.assign(
1170
+ (_a = await parseProviderOptions2({
1171
+ provider: this.providerOptionsName,
1172
+ providerOptions,
1173
+ schema: openaiCompatibleLanguageModelCompletionOptions
1174
+ })) != null ? _a : {},
1175
+ (_b = await parseProviderOptions2({
1176
+ provider: toCamelCase(this.providerOptionsName),
1177
+ providerOptions,
1178
+ schema: openaiCompatibleLanguageModelCompletionOptions
1179
+ })) != null ? _b : {}
1180
+ );
1193
1181
  if (topK != null) {
1194
1182
  warnings.push({ type: "unsupported", feature: "topK" });
1195
1183
  }
@@ -1225,6 +1213,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
1225
1213
  presence_penalty: presencePenalty,
1226
1214
  seed,
1227
1215
  ...providerOptions == null ? void 0 : providerOptions[this.providerOptionsName],
1216
+ ...providerOptions == null ? void 0 : providerOptions[toCamelCase(this.providerOptionsName)],
1228
1217
  // prompt:
1229
1218
  prompt: completionPrompt,
1230
1219
  // stop sequences:
@@ -1234,20 +1223,21 @@ var OpenAICompatibleCompletionLanguageModel = class {
1234
1223
  };
1235
1224
  }
1236
1225
  async doGenerate(options) {
1226
+ var _a, _b;
1237
1227
  const { args, warnings } = await this.getArgs(options);
1238
1228
  const {
1239
1229
  responseHeaders,
1240
1230
  value: response,
1241
1231
  rawValue: rawResponse
1242
- } = await (0, import_provider_utils3.postJsonToApi)({
1232
+ } = await postJsonToApi2({
1243
1233
  url: this.config.url({
1244
1234
  path: "/completions",
1245
1235
  modelId: this.modelId
1246
1236
  }),
1247
- headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1237
+ headers: combineHeaders2((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), options.headers),
1248
1238
  body: args,
1249
1239
  failedResponseHandler: this.failedResponseHandler,
1250
- successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
1240
+ successfulResponseHandler: createJsonResponseHandler2(
1251
1241
  openaiCompatibleCompletionResponseSchema
1252
1242
  ),
1253
1243
  abortSignal: options.abortSignal,
@@ -1275,6 +1265,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
1275
1265
  };
1276
1266
  }
1277
1267
  async doStream(options) {
1268
+ var _a, _b;
1278
1269
  const { args, warnings } = await this.getArgs(options);
1279
1270
  const body = {
1280
1271
  ...args,
@@ -1282,15 +1273,15 @@ var OpenAICompatibleCompletionLanguageModel = class {
1282
1273
  // only include stream_options when in strict compatibility mode:
1283
1274
  stream_options: this.config.includeUsage ? { include_usage: true } : void 0
1284
1275
  };
1285
- const { responseHeaders, value: response } = await (0, import_provider_utils3.postJsonToApi)({
1276
+ const { responseHeaders, value: response } = await postJsonToApi2({
1286
1277
  url: this.config.url({
1287
1278
  path: "/completions",
1288
1279
  modelId: this.modelId
1289
1280
  }),
1290
- headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1281
+ headers: combineHeaders2((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), options.headers),
1291
1282
  body,
1292
1283
  failedResponseHandler: this.failedResponseHandler,
1293
- successfulResponseHandler: (0, import_provider_utils3.createEventSourceResponseHandler)(
1284
+ successfulResponseHandler: createEventSourceResponseHandler2(
1294
1285
  this.chunkSchema
1295
1286
  ),
1296
1287
  abortSignal: options.abortSignal,
@@ -1309,7 +1300,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
1309
1300
  controller.enqueue({ type: "stream-start", warnings });
1310
1301
  },
1311
1302
  transform(chunk, controller) {
1312
- var _a;
1303
+ var _a2;
1313
1304
  if (options.includeRawChunks) {
1314
1305
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
1315
1306
  }
@@ -1342,7 +1333,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
1342
1333
  if ((choice == null ? void 0 : choice.finish_reason) != null) {
1343
1334
  finishReason = {
1344
1335
  unified: mapOpenAICompatibleFinishReason2(choice.finish_reason),
1345
- raw: (_a = choice.finish_reason) != null ? _a : void 0
1336
+ raw: (_a2 = choice.finish_reason) != null ? _a2 : void 0
1346
1337
  };
1347
1338
  }
1348
1339
  if ((choice == null ? void 0 : choice.text) != null) {
@@ -1370,33 +1361,33 @@ var OpenAICompatibleCompletionLanguageModel = class {
1370
1361
  };
1371
1362
  }
1372
1363
  };
1373
- var usageSchema = import_v45.z.object({
1374
- prompt_tokens: import_v45.z.number(),
1375
- completion_tokens: import_v45.z.number(),
1376
- total_tokens: import_v45.z.number()
1364
+ var usageSchema = z5.object({
1365
+ prompt_tokens: z5.number(),
1366
+ completion_tokens: z5.number(),
1367
+ total_tokens: z5.number()
1377
1368
  });
1378
- var openaiCompatibleCompletionResponseSchema = import_v45.z.object({
1379
- id: import_v45.z.string().nullish(),
1380
- created: import_v45.z.number().nullish(),
1381
- model: import_v45.z.string().nullish(),
1382
- choices: import_v45.z.array(
1383
- import_v45.z.object({
1384
- text: import_v45.z.string(),
1385
- finish_reason: import_v45.z.string()
1369
+ var openaiCompatibleCompletionResponseSchema = z5.object({
1370
+ id: z5.string().nullish(),
1371
+ created: z5.number().nullish(),
1372
+ model: z5.string().nullish(),
1373
+ choices: z5.array(
1374
+ z5.object({
1375
+ text: z5.string(),
1376
+ finish_reason: z5.string()
1386
1377
  })
1387
1378
  ),
1388
1379
  usage: usageSchema.nullish()
1389
1380
  });
1390
- var createOpenAICompatibleCompletionChunkSchema = (errorSchema) => import_v45.z.union([
1391
- import_v45.z.object({
1392
- id: import_v45.z.string().nullish(),
1393
- created: import_v45.z.number().nullish(),
1394
- model: import_v45.z.string().nullish(),
1395
- choices: import_v45.z.array(
1396
- import_v45.z.object({
1397
- text: import_v45.z.string(),
1398
- finish_reason: import_v45.z.string().nullish(),
1399
- index: import_v45.z.number()
1381
+ var createOpenAICompatibleCompletionChunkSchema = (errorSchema) => z5.union([
1382
+ z5.object({
1383
+ id: z5.string().nullish(),
1384
+ created: z5.number().nullish(),
1385
+ model: z5.string().nullish(),
1386
+ choices: z5.array(
1387
+ z5.object({
1388
+ text: z5.string(),
1389
+ finish_reason: z5.string().nullish(),
1390
+ index: z5.number()
1400
1391
  })
1401
1392
  ),
1402
1393
  usage: usageSchema.nullish()
@@ -1405,27 +1396,38 @@ var createOpenAICompatibleCompletionChunkSchema = (errorSchema) => import_v45.z.
1405
1396
  ]);
1406
1397
 
1407
1398
  // src/embedding/openai-compatible-embedding-model.ts
1408
- var import_provider5 = require("@ai-sdk/provider");
1409
- var import_provider_utils4 = require("@ai-sdk/provider-utils");
1410
- var import_v47 = require("zod/v4");
1399
+ import {
1400
+ TooManyEmbeddingValuesForCallError
1401
+ } from "@ai-sdk/provider";
1402
+ import {
1403
+ combineHeaders as combineHeaders3,
1404
+ createJsonErrorResponseHandler as createJsonErrorResponseHandler3,
1405
+ createJsonResponseHandler as createJsonResponseHandler3,
1406
+ parseProviderOptions as parseProviderOptions3,
1407
+ postJsonToApi as postJsonToApi3,
1408
+ serializeModelOptions as serializeModelOptions3,
1409
+ WORKFLOW_SERIALIZE as WORKFLOW_SERIALIZE3,
1410
+ WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE3
1411
+ } from "@ai-sdk/provider-utils";
1412
+ import { z as z7 } from "zod/v4";
1411
1413
 
1412
1414
  // src/embedding/openai-compatible-embedding-options.ts
1413
- var import_v46 = require("zod/v4");
1414
- var openaiCompatibleEmbeddingModelOptions = import_v46.z.object({
1415
+ import { z as z6 } from "zod/v4";
1416
+ var openaiCompatibleEmbeddingModelOptions = z6.object({
1415
1417
  /**
1416
1418
  * The number of dimensions the resulting output embeddings should have.
1417
1419
  * Only supported in text-embedding-3 and later models.
1418
1420
  */
1419
- dimensions: import_v46.z.number().optional(),
1421
+ dimensions: z6.number().optional(),
1420
1422
  /**
1421
1423
  * A unique identifier representing your end-user, which can help providers to
1422
1424
  * monitor and detect abuse.
1423
1425
  */
1424
- user: import_v46.z.string().optional()
1426
+ user: z6.string().optional()
1425
1427
  });
1426
1428
 
1427
1429
  // src/embedding/openai-compatible-embedding-model.ts
1428
- var OpenAICompatibleEmbeddingModel = class {
1430
+ var OpenAICompatibleEmbeddingModel = class _OpenAICompatibleEmbeddingModel {
1429
1431
  constructor(modelId, config) {
1430
1432
  this.specificationVersion = "v4";
1431
1433
  this.modelId = modelId;
@@ -1442,6 +1444,15 @@ var OpenAICompatibleEmbeddingModel = class {
1442
1444
  var _a;
1443
1445
  return (_a = this.config.supportsParallelCalls) != null ? _a : true;
1444
1446
  }
1447
+ static [WORKFLOW_SERIALIZE3](model) {
1448
+ return serializeModelOptions3({
1449
+ modelId: model.modelId,
1450
+ config: model.config
1451
+ });
1452
+ }
1453
+ static [WORKFLOW_DESERIALIZE3](options) {
1454
+ return new _OpenAICompatibleEmbeddingModel(options.modelId, options.config);
1455
+ }
1445
1456
  get providerOptionsName() {
1446
1457
  return this.config.provider.split(".")[0].trim();
1447
1458
  }
@@ -1451,34 +1462,40 @@ var OpenAICompatibleEmbeddingModel = class {
1451
1462
  abortSignal,
1452
1463
  providerOptions
1453
1464
  }) {
1454
- var _a, _b, _c;
1465
+ var _a, _b, _c, _d, _e;
1455
1466
  const warnings = [];
1456
- const deprecatedOptions = await (0, import_provider_utils4.parseProviderOptions)({
1467
+ const deprecatedOptions = await parseProviderOptions3({
1457
1468
  provider: "openai-compatible",
1458
1469
  providerOptions,
1459
1470
  schema: openaiCompatibleEmbeddingModelOptions
1460
1471
  });
1461
1472
  if (deprecatedOptions != null) {
1462
1473
  warnings.push({
1463
- type: "other",
1464
- message: `The 'openai-compatible' key in providerOptions is deprecated. Use 'openaiCompatible' instead.`
1474
+ type: "deprecated",
1475
+ setting: "providerOptions key 'openai-compatible'",
1476
+ message: "Use 'openaiCompatible' instead."
1465
1477
  });
1466
1478
  }
1479
+ warnIfDeprecatedProviderOptionsKey({
1480
+ rawName: this.providerOptionsName,
1481
+ providerOptions,
1482
+ warnings
1483
+ });
1467
1484
  const compatibleOptions = Object.assign(
1468
1485
  deprecatedOptions != null ? deprecatedOptions : {},
1469
- (_a = await (0, import_provider_utils4.parseProviderOptions)({
1486
+ (_a = await parseProviderOptions3({
1470
1487
  provider: "openaiCompatible",
1471
1488
  providerOptions,
1472
1489
  schema: openaiCompatibleEmbeddingModelOptions
1473
1490
  })) != null ? _a : {},
1474
- (_b = await (0, import_provider_utils4.parseProviderOptions)({
1491
+ (_b = await parseProviderOptions3({
1475
1492
  provider: this.providerOptionsName,
1476
1493
  providerOptions,
1477
1494
  schema: openaiCompatibleEmbeddingModelOptions
1478
1495
  })) != null ? _b : {}
1479
1496
  );
1480
1497
  if (values.length > this.maxEmbeddingsPerCall) {
1481
- throw new import_provider5.TooManyEmbeddingValuesForCallError({
1498
+ throw new TooManyEmbeddingValuesForCallError({
1482
1499
  provider: this.provider,
1483
1500
  modelId: this.modelId,
1484
1501
  maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
@@ -1489,12 +1506,12 @@ var OpenAICompatibleEmbeddingModel = class {
1489
1506
  responseHeaders,
1490
1507
  value: response,
1491
1508
  rawValue
1492
- } = await (0, import_provider_utils4.postJsonToApi)({
1509
+ } = await postJsonToApi3({
1493
1510
  url: this.config.url({
1494
1511
  path: "/embeddings",
1495
1512
  modelId: this.modelId
1496
1513
  }),
1497
- headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), headers),
1514
+ headers: combineHeaders3((_d = (_c = this.config).headers) == null ? void 0 : _d.call(_c), headers),
1498
1515
  body: {
1499
1516
  model: this.modelId,
1500
1517
  input: values,
@@ -1502,10 +1519,10 @@ var OpenAICompatibleEmbeddingModel = class {
1502
1519
  dimensions: compatibleOptions.dimensions,
1503
1520
  user: compatibleOptions.user
1504
1521
  },
1505
- failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
1506
- (_c = this.config.errorStructure) != null ? _c : defaultOpenAICompatibleErrorStructure
1522
+ failedResponseHandler: createJsonErrorResponseHandler3(
1523
+ (_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
1507
1524
  ),
1508
- successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
1525
+ successfulResponseHandler: createJsonResponseHandler3(
1509
1526
  openaiTextEmbeddingResponseSchema
1510
1527
  ),
1511
1528
  abortSignal,
@@ -1520,16 +1537,28 @@ var OpenAICompatibleEmbeddingModel = class {
1520
1537
  };
1521
1538
  }
1522
1539
  };
1523
- var openaiTextEmbeddingResponseSchema = import_v47.z.object({
1524
- data: import_v47.z.array(import_v47.z.object({ embedding: import_v47.z.array(import_v47.z.number()) })),
1525
- usage: import_v47.z.object({ prompt_tokens: import_v47.z.number() }).nullish(),
1526
- providerMetadata: import_v47.z.record(import_v47.z.string(), import_v47.z.record(import_v47.z.string(), import_v47.z.any())).optional()
1540
+ var openaiTextEmbeddingResponseSchema = z7.object({
1541
+ data: z7.array(z7.object({ embedding: z7.array(z7.number()) })),
1542
+ usage: z7.object({ prompt_tokens: z7.number() }).nullish(),
1543
+ providerMetadata: z7.record(z7.string(), z7.record(z7.string(), z7.any())).optional()
1527
1544
  });
1528
1545
 
1529
1546
  // src/image/openai-compatible-image-model.ts
1530
- var import_provider_utils5 = require("@ai-sdk/provider-utils");
1531
- var import_v48 = require("zod/v4");
1532
- var OpenAICompatibleImageModel = class {
1547
+ import {
1548
+ combineHeaders as combineHeaders4,
1549
+ convertBase64ToUint8Array as convertBase64ToUint8Array2,
1550
+ convertToFormData,
1551
+ createJsonErrorResponseHandler as createJsonErrorResponseHandler4,
1552
+ createJsonResponseHandler as createJsonResponseHandler4,
1553
+ downloadBlob,
1554
+ postFormDataToApi,
1555
+ postJsonToApi as postJsonToApi4,
1556
+ serializeModelOptions as serializeModelOptions4,
1557
+ WORKFLOW_SERIALIZE as WORKFLOW_SERIALIZE4,
1558
+ WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE4
1559
+ } from "@ai-sdk/provider-utils";
1560
+ import { z as z8 } from "zod/v4";
1561
+ var OpenAICompatibleImageModel = class _OpenAICompatibleImageModel {
1533
1562
  constructor(modelId, config) {
1534
1563
  this.modelId = modelId;
1535
1564
  this.config = config;
@@ -1545,8 +1574,21 @@ var OpenAICompatibleImageModel = class {
1545
1574
  get providerOptionsKey() {
1546
1575
  return this.config.provider.split(".")[0].trim();
1547
1576
  }
1548
- // TODO: deprecate non-camelCase keys and remove in future major version
1549
- getArgs(providerOptions) {
1577
+ static [WORKFLOW_SERIALIZE4](model) {
1578
+ return serializeModelOptions4({
1579
+ modelId: model.modelId,
1580
+ config: model.config
1581
+ });
1582
+ }
1583
+ static [WORKFLOW_DESERIALIZE4](options) {
1584
+ return new _OpenAICompatibleImageModel(options.modelId, options.config);
1585
+ }
1586
+ getArgs(providerOptions, warnings) {
1587
+ warnIfDeprecatedProviderOptionsKey({
1588
+ rawName: this.providerOptionsKey,
1589
+ providerOptions,
1590
+ warnings
1591
+ });
1550
1592
  return {
1551
1593
  ...providerOptions[this.providerOptionsKey],
1552
1594
  ...providerOptions[toCamelCase(this.providerOptionsKey)]
@@ -1564,7 +1606,7 @@ var OpenAICompatibleImageModel = class {
1564
1606
  files,
1565
1607
  mask
1566
1608
  }) {
1567
- var _a, _b, _c, _d, _e;
1609
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
1568
1610
  const warnings = [];
1569
1611
  if (aspectRatio != null) {
1570
1612
  warnings.push({
@@ -1577,15 +1619,15 @@ var OpenAICompatibleImageModel = class {
1577
1619
  warnings.push({ type: "unsupported", feature: "seed" });
1578
1620
  }
1579
1621
  const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
1580
- const args = this.getArgs(providerOptions);
1622
+ const args = this.getArgs(providerOptions, warnings);
1581
1623
  if (files != null && files.length > 0) {
1582
- const { value: response2, responseHeaders: responseHeaders2 } = await (0, import_provider_utils5.postFormDataToApi)({
1624
+ const { value: response2, responseHeaders: responseHeaders2 } = await postFormDataToApi({
1583
1625
  url: this.config.url({
1584
1626
  path: "/images/edits",
1585
1627
  modelId: this.modelId
1586
1628
  }),
1587
- headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), headers),
1588
- formData: (0, import_provider_utils5.convertToFormData)({
1629
+ headers: combineHeaders4((_e = (_d = this.config).headers) == null ? void 0 : _e.call(_d), headers),
1630
+ formData: convertToFormData({
1589
1631
  model: this.modelId,
1590
1632
  prompt,
1591
1633
  image: await Promise.all(files.map((file) => fileToBlob(file))),
@@ -1594,10 +1636,10 @@ var OpenAICompatibleImageModel = class {
1594
1636
  size,
1595
1637
  ...args
1596
1638
  }),
1597
- failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)(
1598
- (_d = this.config.errorStructure) != null ? _d : defaultOpenAICompatibleErrorStructure
1639
+ failedResponseHandler: createJsonErrorResponseHandler4(
1640
+ (_f = this.config.errorStructure) != null ? _f : defaultOpenAICompatibleErrorStructure
1599
1641
  ),
1600
- successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(
1642
+ successfulResponseHandler: createJsonResponseHandler4(
1601
1643
  openaiCompatibleImageResponseSchema
1602
1644
  ),
1603
1645
  abortSignal,
@@ -1613,12 +1655,12 @@ var OpenAICompatibleImageModel = class {
1613
1655
  }
1614
1656
  };
1615
1657
  }
1616
- const { value: response, responseHeaders } = await (0, import_provider_utils5.postJsonToApi)({
1658
+ const { value: response, responseHeaders } = await postJsonToApi4({
1617
1659
  url: this.config.url({
1618
1660
  path: "/images/generations",
1619
1661
  modelId: this.modelId
1620
1662
  }),
1621
- headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), headers),
1663
+ headers: combineHeaders4((_h = (_g = this.config).headers) == null ? void 0 : _h.call(_g), headers),
1622
1664
  body: {
1623
1665
  model: this.modelId,
1624
1666
  prompt,
@@ -1627,10 +1669,10 @@ var OpenAICompatibleImageModel = class {
1627
1669
  ...args,
1628
1670
  response_format: "b64_json"
1629
1671
  },
1630
- failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)(
1631
- (_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
1672
+ failedResponseHandler: createJsonErrorResponseHandler4(
1673
+ (_i = this.config.errorStructure) != null ? _i : defaultOpenAICompatibleErrorStructure
1632
1674
  ),
1633
- successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(
1675
+ successfulResponseHandler: createJsonResponseHandler4(
1634
1676
  openaiCompatibleImageResponseSchema
1635
1677
  ),
1636
1678
  abortSignal,
@@ -1647,35 +1689,35 @@ var OpenAICompatibleImageModel = class {
1647
1689
  };
1648
1690
  }
1649
1691
  };
1650
- var openaiCompatibleImageResponseSchema = import_v48.z.object({
1651
- data: import_v48.z.array(import_v48.z.object({ b64_json: import_v48.z.string() }))
1692
+ var openaiCompatibleImageResponseSchema = z8.object({
1693
+ data: z8.array(z8.object({ b64_json: z8.string() }))
1652
1694
  });
1653
1695
  async function fileToBlob(file) {
1654
1696
  if (file.type === "url") {
1655
- return (0, import_provider_utils5.downloadBlob)(file.url);
1697
+ return downloadBlob(file.url);
1656
1698
  }
1657
- const data = file.data instanceof Uint8Array ? file.data : (0, import_provider_utils5.convertBase64ToUint8Array)(file.data);
1699
+ const data = file.data instanceof Uint8Array ? file.data : convertBase64ToUint8Array2(file.data);
1658
1700
  return new Blob([data], { type: file.mediaType });
1659
1701
  }
1660
- function toCamelCase(str) {
1661
- return str.replace(/[_-]([a-z])/g, (g) => g[1].toUpperCase());
1662
- }
1663
1702
 
1664
1703
  // src/openai-compatible-provider.ts
1665
- var import_provider_utils6 = require("@ai-sdk/provider-utils");
1704
+ import {
1705
+ withoutTrailingSlash,
1706
+ withUserAgentSuffix
1707
+ } from "@ai-sdk/provider-utils";
1666
1708
 
1667
1709
  // src/version.ts
1668
- var VERSION = true ? "3.0.0-beta.3" : "0.0.0-test";
1710
+ var VERSION = true ? "3.0.0-beta.31" : "0.0.0-test";
1669
1711
 
1670
1712
  // src/openai-compatible-provider.ts
1671
1713
  function createOpenAICompatible(options) {
1672
- const baseURL = (0, import_provider_utils6.withoutTrailingSlash)(options.baseURL);
1714
+ const baseURL = withoutTrailingSlash(options.baseURL);
1673
1715
  const providerName = options.name;
1674
1716
  const headers = {
1675
1717
  ...options.apiKey && { Authorization: `Bearer ${options.apiKey}` },
1676
1718
  ...options.headers
1677
1719
  };
1678
- const getHeaders = () => (0, import_provider_utils6.withUserAgentSuffix)(headers, `ai-sdk/openai-compatible/${VERSION}`);
1720
+ const getHeaders = () => withUserAgentSuffix(headers, `ai-sdk/openai-compatible/${VERSION}`);
1679
1721
  const getCommonModelConfig = (modelType) => ({
1680
1722
  provider: `${providerName}.${modelType}`,
1681
1723
  url: ({ path }) => {
@@ -1714,13 +1756,12 @@ function createOpenAICompatible(options) {
1714
1756
  provider.imageModel = createImageModel;
1715
1757
  return provider;
1716
1758
  }
1717
- // Annotate the CommonJS export names for ESM import in node:
1718
- 0 && (module.exports = {
1759
+ export {
1719
1760
  OpenAICompatibleChatLanguageModel,
1720
1761
  OpenAICompatibleCompletionLanguageModel,
1721
1762
  OpenAICompatibleEmbeddingModel,
1722
1763
  OpenAICompatibleImageModel,
1723
1764
  VERSION,
1724
1765
  createOpenAICompatible
1725
- });
1766
+ };
1726
1767
  //# sourceMappingURL=index.js.map