@ai-sdk/openai-compatible 1.0.4 → 1.0.5

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,12 @@
1
1
  # @ai-sdk/openai-compatible
2
2
 
3
+ ## 1.0.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 8f8a521: fix(providers): use convertToBase64 for Uint8Array image parts to produce valid data URLs; keep mediaType normalization and URL passthrough
8
+ - e92b78b: fix (provider/openai-compatible): revert usage fallback specific to moonshotai
9
+
3
10
  ## 1.0.4
4
11
 
5
12
  ### Patch Changes
package/dist/index.js CHANGED
@@ -30,11 +30,12 @@ module.exports = __toCommonJS(src_exports);
30
30
 
31
31
  // src/openai-compatible-chat-language-model.ts
32
32
  var import_provider3 = require("@ai-sdk/provider");
33
- var import_provider_utils = require("@ai-sdk/provider-utils");
33
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
34
34
  var import_v43 = require("zod/v4");
35
35
 
36
36
  // src/convert-to-openai-compatible-chat-messages.ts
37
37
  var import_provider = require("@ai-sdk/provider");
38
+ var import_provider_utils = require("@ai-sdk/provider-utils");
38
39
  function getOpenAIMetadata(message) {
39
40
  var _a, _b;
40
41
  return (_b = (_a = message == null ? void 0 : message.providerOptions) == null ? void 0 : _a.openaiCompatible) != null ? _b : {};
@@ -71,7 +72,7 @@ function convertToOpenAICompatibleChatMessages(prompt) {
71
72
  return {
72
73
  type: "image_url",
73
74
  image_url: {
74
- url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${part.data}`
75
+ url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${(0, import_provider_utils.convertToBase64)(part.data)}`
75
76
  },
76
77
  ...partMetadata
77
78
  };
@@ -280,7 +281,7 @@ var OpenAICompatibleChatLanguageModel = class {
280
281
  this.chunkSchema = createOpenAICompatibleChatChunkSchema(
281
282
  errorStructure.errorSchema
282
283
  );
283
- this.failedResponseHandler = (0, import_provider_utils.createJsonErrorResponseHandler)(errorStructure);
284
+ this.failedResponseHandler = (0, import_provider_utils2.createJsonErrorResponseHandler)(errorStructure);
284
285
  this.supportsStructuredOutputs = (_b = config.supportsStructuredOutputs) != null ? _b : false;
285
286
  }
286
287
  get provider() {
@@ -311,12 +312,12 @@ var OpenAICompatibleChatLanguageModel = class {
311
312
  var _a, _b, _c;
312
313
  const warnings = [];
313
314
  const compatibleOptions = Object.assign(
314
- (_a = await (0, import_provider_utils.parseProviderOptions)({
315
+ (_a = await (0, import_provider_utils2.parseProviderOptions)({
315
316
  provider: "openai-compatible",
316
317
  providerOptions,
317
318
  schema: openaiCompatibleProviderOptions
318
319
  })) != null ? _a : {},
319
- (_b = await (0, import_provider_utils.parseProviderOptions)({
320
+ (_b = await (0, import_provider_utils2.parseProviderOptions)({
320
321
  provider: this.providerOptionsName,
321
322
  providerOptions,
322
323
  schema: openaiCompatibleProviderOptions
@@ -381,15 +382,15 @@ var OpenAICompatibleChatLanguageModel = class {
381
382
  responseHeaders,
382
383
  value: responseBody,
383
384
  rawValue: rawResponse
384
- } = await (0, import_provider_utils.postJsonToApi)({
385
+ } = await (0, import_provider_utils2.postJsonToApi)({
385
386
  url: this.config.url({
386
387
  path: "/chat/completions",
387
388
  modelId: this.modelId
388
389
  }),
389
- headers: (0, import_provider_utils.combineHeaders)(this.config.headers(), options.headers),
390
+ headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
390
391
  body: args,
391
392
  failedResponseHandler: this.failedResponseHandler,
392
- successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(
393
+ successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
393
394
  OpenAICompatibleChatResponseSchema
394
395
  ),
395
396
  abortSignal: options.abortSignal,
@@ -412,7 +413,7 @@ var OpenAICompatibleChatLanguageModel = class {
412
413
  for (const toolCall of choice.message.tool_calls) {
413
414
  content.push({
414
415
  type: "tool-call",
415
- toolCallId: (_b = toolCall.id) != null ? _b : (0, import_provider_utils.generateId)(),
416
+ toolCallId: (_b = toolCall.id) != null ? _b : (0, import_provider_utils2.generateId)(),
416
417
  toolName: toolCall.function.name,
417
418
  input: toolCall.function.arguments
418
419
  });
@@ -461,15 +462,15 @@ var OpenAICompatibleChatLanguageModel = class {
461
462
  stream_options: this.config.includeUsage ? { include_usage: true } : void 0
462
463
  };
463
464
  const metadataExtractor = (_a = this.config.metadataExtractor) == null ? void 0 : _a.createStreamExtractor();
464
- const { responseHeaders, value: response } = await (0, import_provider_utils.postJsonToApi)({
465
+ const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
465
466
  url: this.config.url({
466
467
  path: "/chat/completions",
467
468
  modelId: this.modelId
468
469
  }),
469
- headers: (0, import_provider_utils.combineHeaders)(this.config.headers(), options.headers),
470
+ headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
470
471
  body,
471
472
  failedResponseHandler: this.failedResponseHandler,
472
- successfulResponseHandler: (0, import_provider_utils.createEventSourceResponseHandler)(
473
+ successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(
473
474
  this.chunkSchema
474
475
  ),
475
476
  abortSignal: options.abortSignal,
@@ -502,7 +503,7 @@ var OpenAICompatibleChatLanguageModel = class {
502
503
  },
503
504
  // TODO we lost type safety on Chunk, most likely due to the error schema. MUST FIX
504
505
  transform(chunk, controller) {
505
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
506
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
506
507
  if (options.includeRawChunks) {
507
508
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
508
509
  }
@@ -525,15 +526,14 @@ var OpenAICompatibleChatLanguageModel = class {
525
526
  ...getResponseMetadata(value)
526
527
  });
527
528
  }
528
- const effectiveUsage = (_c = value.usage) != null ? _c : (_b = (_a2 = value.choices) == null ? void 0 : _a2[0]) == null ? void 0 : _b.usage;
529
- if (effectiveUsage != null) {
529
+ if (value.usage != null) {
530
530
  const {
531
531
  prompt_tokens,
532
532
  completion_tokens,
533
533
  total_tokens,
534
534
  prompt_tokens_details,
535
535
  completion_tokens_details
536
- } = effectiveUsage;
536
+ } = value.usage;
537
537
  usage.promptTokens = prompt_tokens != null ? prompt_tokens : void 0;
538
538
  usage.completionTokens = completion_tokens != null ? completion_tokens : void 0;
539
539
  usage.totalTokens = total_tokens != null ? total_tokens : void 0;
@@ -560,7 +560,7 @@ var OpenAICompatibleChatLanguageModel = class {
560
560
  return;
561
561
  }
562
562
  const delta = choice.delta;
563
- const reasoningContent = (_d = delta.reasoning_content) != null ? _d : delta.reasoning;
563
+ const reasoningContent = (_a2 = delta.reasoning_content) != null ? _a2 : delta.reasoning;
564
564
  if (reasoningContent) {
565
565
  if (!isActiveReasoning) {
566
566
  controller.enqueue({
@@ -596,7 +596,7 @@ var OpenAICompatibleChatLanguageModel = class {
596
596
  message: `Expected 'id' to be a string.`
597
597
  });
598
598
  }
599
- if (((_e = toolCallDelta.function) == null ? void 0 : _e.name) == null) {
599
+ if (((_b = toolCallDelta.function) == null ? void 0 : _b.name) == null) {
600
600
  throw new import_provider3.InvalidResponseDataError({
601
601
  data: toolCallDelta,
602
602
  message: `Expected 'function.name' to be a string.`
@@ -612,12 +612,12 @@ var OpenAICompatibleChatLanguageModel = class {
612
612
  type: "function",
613
613
  function: {
614
614
  name: toolCallDelta.function.name,
615
- arguments: (_f = toolCallDelta.function.arguments) != null ? _f : ""
615
+ arguments: (_c = toolCallDelta.function.arguments) != null ? _c : ""
616
616
  },
617
617
  hasFinished: false
618
618
  };
619
619
  const toolCall2 = toolCalls[index];
620
- if (((_g = toolCall2.function) == null ? void 0 : _g.name) != null && ((_h = toolCall2.function) == null ? void 0 : _h.arguments) != null) {
620
+ if (((_d = toolCall2.function) == null ? void 0 : _d.name) != null && ((_e = toolCall2.function) == null ? void 0 : _e.arguments) != null) {
621
621
  if (toolCall2.function.arguments.length > 0) {
622
622
  controller.enqueue({
623
623
  type: "tool-input-start",
@@ -625,14 +625,14 @@ var OpenAICompatibleChatLanguageModel = class {
625
625
  toolName: toolCall2.function.name
626
626
  });
627
627
  }
628
- if ((0, import_provider_utils.isParsableJson)(toolCall2.function.arguments)) {
628
+ if ((0, import_provider_utils2.isParsableJson)(toolCall2.function.arguments)) {
629
629
  controller.enqueue({
630
630
  type: "tool-input-end",
631
631
  id: toolCall2.id
632
632
  });
633
633
  controller.enqueue({
634
634
  type: "tool-call",
635
- toolCallId: (_i = toolCall2.id) != null ? _i : (0, import_provider_utils.generateId)(),
635
+ toolCallId: (_f = toolCall2.id) != null ? _f : (0, import_provider_utils2.generateId)(),
636
636
  toolName: toolCall2.function.name,
637
637
  input: toolCall2.function.arguments
638
638
  });
@@ -645,22 +645,22 @@ var OpenAICompatibleChatLanguageModel = class {
645
645
  if (toolCall.hasFinished) {
646
646
  continue;
647
647
  }
648
- if (((_j = toolCallDelta.function) == null ? void 0 : _j.arguments) != null) {
649
- toolCall.function.arguments += (_l = (_k = toolCallDelta.function) == null ? void 0 : _k.arguments) != null ? _l : "";
648
+ if (((_g = toolCallDelta.function) == null ? void 0 : _g.arguments) != null) {
649
+ toolCall.function.arguments += (_i = (_h = toolCallDelta.function) == null ? void 0 : _h.arguments) != null ? _i : "";
650
650
  }
651
651
  controller.enqueue({
652
652
  type: "tool-input-delta",
653
653
  id: toolCall.id,
654
- delta: (_m = toolCallDelta.function.arguments) != null ? _m : ""
654
+ delta: (_j = toolCallDelta.function.arguments) != null ? _j : ""
655
655
  });
656
- if (((_n = toolCall.function) == null ? void 0 : _n.name) != null && ((_o = toolCall.function) == null ? void 0 : _o.arguments) != null && (0, import_provider_utils.isParsableJson)(toolCall.function.arguments)) {
656
+ if (((_k = toolCall.function) == null ? void 0 : _k.name) != null && ((_l = toolCall.function) == null ? void 0 : _l.arguments) != null && (0, import_provider_utils2.isParsableJson)(toolCall.function.arguments)) {
657
657
  controller.enqueue({
658
658
  type: "tool-input-end",
659
659
  id: toolCall.id
660
660
  });
661
661
  controller.enqueue({
662
662
  type: "tool-call",
663
- toolCallId: (_p = toolCall.id) != null ? _p : (0, import_provider_utils.generateId)(),
663
+ toolCallId: (_m = toolCall.id) != null ? _m : (0, import_provider_utils2.generateId)(),
664
664
  toolName: toolCall.function.name,
665
665
  input: toolCall.function.arguments
666
666
  });
@@ -686,7 +686,7 @@ var OpenAICompatibleChatLanguageModel = class {
686
686
  });
687
687
  controller.enqueue({
688
688
  type: "tool-call",
689
- toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils.generateId)(),
689
+ toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils2.generateId)(),
690
690
  toolName: toolCall.function.name,
691
691
  input: toolCall.function.arguments
692
692
  });
@@ -785,9 +785,7 @@ var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_v43.z.union(
785
785
  })
786
786
  ).nullish()
787
787
  }).nullish(),
788
- finish_reason: import_v43.z.string().nullish(),
789
- // Some providers report usage within each choice in streaming chunks
790
- usage: openaiCompatibleTokenUsageSchema
788
+ finish_reason: import_v43.z.string().nullish()
791
789
  })
792
790
  ),
793
791
  usage: openaiCompatibleTokenUsageSchema
@@ -796,7 +794,7 @@ var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_v43.z.union(
796
794
  ]);
797
795
 
798
796
  // src/openai-compatible-completion-language-model.ts
799
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
797
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
800
798
  var import_v45 = require("zod/v4");
801
799
 
802
800
  // src/convert-to-openai-compatible-completion-prompt.ts
@@ -911,7 +909,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
911
909
  this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(
912
910
  errorStructure.errorSchema
913
911
  );
914
- this.failedResponseHandler = (0, import_provider_utils2.createJsonErrorResponseHandler)(errorStructure);
912
+ this.failedResponseHandler = (0, import_provider_utils3.createJsonErrorResponseHandler)(errorStructure);
915
913
  }
916
914
  get provider() {
917
915
  return this.config.provider;
@@ -940,7 +938,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
940
938
  }) {
941
939
  var _a;
942
940
  const warnings = [];
943
- const completionOptions = (_a = await (0, import_provider_utils2.parseProviderOptions)({
941
+ const completionOptions = (_a = await (0, import_provider_utils3.parseProviderOptions)({
944
942
  provider: this.providerOptionsName,
945
943
  providerOptions,
946
944
  schema: openaiCompatibleCompletionProviderOptions
@@ -995,15 +993,15 @@ var OpenAICompatibleCompletionLanguageModel = class {
995
993
  responseHeaders,
996
994
  value: response,
997
995
  rawValue: rawResponse
998
- } = await (0, import_provider_utils2.postJsonToApi)({
996
+ } = await (0, import_provider_utils3.postJsonToApi)({
999
997
  url: this.config.url({
1000
998
  path: "/completions",
1001
999
  modelId: this.modelId
1002
1000
  }),
1003
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
1001
+ headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1004
1002
  body: args,
1005
1003
  failedResponseHandler: this.failedResponseHandler,
1006
- successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
1004
+ successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
1007
1005
  openaiCompatibleCompletionResponseSchema
1008
1006
  ),
1009
1007
  abortSignal: options.abortSignal,
@@ -1039,15 +1037,15 @@ var OpenAICompatibleCompletionLanguageModel = class {
1039
1037
  // only include stream_options when in strict compatibility mode:
1040
1038
  stream_options: this.config.includeUsage ? { include_usage: true } : void 0
1041
1039
  };
1042
- const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
1040
+ const { responseHeaders, value: response } = await (0, import_provider_utils3.postJsonToApi)({
1043
1041
  url: this.config.url({
1044
1042
  path: "/completions",
1045
1043
  modelId: this.modelId
1046
1044
  }),
1047
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
1045
+ headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1048
1046
  body,
1049
1047
  failedResponseHandler: this.failedResponseHandler,
1050
- successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(
1048
+ successfulResponseHandler: (0, import_provider_utils3.createEventSourceResponseHandler)(
1051
1049
  this.chunkSchema
1052
1050
  ),
1053
1051
  abortSignal: options.abortSignal,
@@ -1165,7 +1163,7 @@ var createOpenAICompatibleCompletionChunkSchema = (errorSchema) => import_v45.z.
1165
1163
 
1166
1164
  // src/openai-compatible-embedding-model.ts
1167
1165
  var import_provider5 = require("@ai-sdk/provider");
1168
- var import_provider_utils3 = require("@ai-sdk/provider-utils");
1166
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
1169
1167
  var import_v47 = require("zod/v4");
1170
1168
 
1171
1169
  // src/openai-compatible-embedding-options.ts
@@ -1212,12 +1210,12 @@ var OpenAICompatibleEmbeddingModel = class {
1212
1210
  }) {
1213
1211
  var _a, _b, _c;
1214
1212
  const compatibleOptions = Object.assign(
1215
- (_a = await (0, import_provider_utils3.parseProviderOptions)({
1213
+ (_a = await (0, import_provider_utils4.parseProviderOptions)({
1216
1214
  provider: "openai-compatible",
1217
1215
  providerOptions,
1218
1216
  schema: openaiCompatibleEmbeddingProviderOptions
1219
1217
  })) != null ? _a : {},
1220
- (_b = await (0, import_provider_utils3.parseProviderOptions)({
1218
+ (_b = await (0, import_provider_utils4.parseProviderOptions)({
1221
1219
  provider: this.providerOptionsName,
1222
1220
  providerOptions,
1223
1221
  schema: openaiCompatibleEmbeddingProviderOptions
@@ -1235,12 +1233,12 @@ var OpenAICompatibleEmbeddingModel = class {
1235
1233
  responseHeaders,
1236
1234
  value: response,
1237
1235
  rawValue
1238
- } = await (0, import_provider_utils3.postJsonToApi)({
1236
+ } = await (0, import_provider_utils4.postJsonToApi)({
1239
1237
  url: this.config.url({
1240
1238
  path: "/embeddings",
1241
1239
  modelId: this.modelId
1242
1240
  }),
1243
- headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), headers),
1241
+ headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), headers),
1244
1242
  body: {
1245
1243
  model: this.modelId,
1246
1244
  input: values,
@@ -1248,10 +1246,10 @@ var OpenAICompatibleEmbeddingModel = class {
1248
1246
  dimensions: compatibleOptions.dimensions,
1249
1247
  user: compatibleOptions.user
1250
1248
  },
1251
- failedResponseHandler: (0, import_provider_utils3.createJsonErrorResponseHandler)(
1249
+ failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
1252
1250
  (_c = this.config.errorStructure) != null ? _c : defaultOpenAICompatibleErrorStructure
1253
1251
  ),
1254
- successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
1252
+ successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
1255
1253
  openaiTextEmbeddingResponseSchema
1256
1254
  ),
1257
1255
  abortSignal,
@@ -1272,7 +1270,7 @@ var openaiTextEmbeddingResponseSchema = import_v47.z.object({
1272
1270
  });
1273
1271
 
1274
1272
  // src/openai-compatible-image-model.ts
1275
- var import_provider_utils4 = require("@ai-sdk/provider-utils");
1273
+ var import_provider_utils5 = require("@ai-sdk/provider-utils");
1276
1274
  var import_v48 = require("zod/v4");
1277
1275
  var OpenAICompatibleImageModel = class {
1278
1276
  constructor(modelId, config) {
@@ -1307,12 +1305,12 @@ var OpenAICompatibleImageModel = class {
1307
1305
  warnings.push({ type: "unsupported-setting", setting: "seed" });
1308
1306
  }
1309
1307
  const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
1310
- const { value: response, responseHeaders } = await (0, import_provider_utils4.postJsonToApi)({
1308
+ const { value: response, responseHeaders } = await (0, import_provider_utils5.postJsonToApi)({
1311
1309
  url: this.config.url({
1312
1310
  path: "/images/generations",
1313
1311
  modelId: this.modelId
1314
1312
  }),
1315
- headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), headers),
1313
+ headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), headers),
1316
1314
  body: {
1317
1315
  model: this.modelId,
1318
1316
  prompt,
@@ -1321,10 +1319,10 @@ var OpenAICompatibleImageModel = class {
1321
1319
  ...(_d = providerOptions.openai) != null ? _d : {},
1322
1320
  response_format: "b64_json"
1323
1321
  },
1324
- failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
1322
+ failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)(
1325
1323
  (_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
1326
1324
  ),
1327
- successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
1325
+ successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(
1328
1326
  openaiCompatibleImageResponseSchema
1329
1327
  ),
1330
1328
  abortSignal,
@@ -1346,9 +1344,9 @@ var openaiCompatibleImageResponseSchema = import_v48.z.object({
1346
1344
  });
1347
1345
 
1348
1346
  // src/openai-compatible-provider.ts
1349
- var import_provider_utils5 = require("@ai-sdk/provider-utils");
1347
+ var import_provider_utils6 = require("@ai-sdk/provider-utils");
1350
1348
  function createOpenAICompatible(options) {
1351
- const baseURL = (0, import_provider_utils5.withoutTrailingSlash)(options.baseURL);
1349
+ const baseURL = (0, import_provider_utils6.withoutTrailingSlash)(options.baseURL);
1352
1350
  const providerName = options.name;
1353
1351
  const getHeaders = () => ({
1354
1352
  ...options.apiKey && { Authorization: `Bearer ${options.apiKey}` },