@ai-sdk/openai-compatible 1.0.3 → 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,19 @@
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
+
10
+ ## 1.0.4
11
+
12
+ ### Patch Changes
13
+
14
+ - 5f4c71f: feat (provider/openai-compatible): fall back to look for usage in choices
15
+ - da314cd: chore (provider/openai-compatible): inline usage fallback logic
16
+
3
17
  ## 1.0.3
4
18
 
5
19
  ### 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,
@@ -624,14 +625,14 @@ var OpenAICompatibleChatLanguageModel = class {
624
625
  toolName: toolCall2.function.name
625
626
  });
626
627
  }
627
- if ((0, import_provider_utils.isParsableJson)(toolCall2.function.arguments)) {
628
+ if ((0, import_provider_utils2.isParsableJson)(toolCall2.function.arguments)) {
628
629
  controller.enqueue({
629
630
  type: "tool-input-end",
630
631
  id: toolCall2.id
631
632
  });
632
633
  controller.enqueue({
633
634
  type: "tool-call",
634
- toolCallId: (_f = toolCall2.id) != null ? _f : (0, import_provider_utils.generateId)(),
635
+ toolCallId: (_f = toolCall2.id) != null ? _f : (0, import_provider_utils2.generateId)(),
635
636
  toolName: toolCall2.function.name,
636
637
  input: toolCall2.function.arguments
637
638
  });
@@ -652,14 +653,14 @@ var OpenAICompatibleChatLanguageModel = class {
652
653
  id: toolCall.id,
653
654
  delta: (_j = toolCallDelta.function.arguments) != null ? _j : ""
654
655
  });
655
- if (((_k = toolCall.function) == null ? void 0 : _k.name) != null && ((_l = toolCall.function) == null ? void 0 : _l.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)) {
656
657
  controller.enqueue({
657
658
  type: "tool-input-end",
658
659
  id: toolCall.id
659
660
  });
660
661
  controller.enqueue({
661
662
  type: "tool-call",
662
- toolCallId: (_m = toolCall.id) != null ? _m : (0, import_provider_utils.generateId)(),
663
+ toolCallId: (_m = toolCall.id) != null ? _m : (0, import_provider_utils2.generateId)(),
663
664
  toolName: toolCall.function.name,
664
665
  input: toolCall.function.arguments
665
666
  });
@@ -685,7 +686,7 @@ var OpenAICompatibleChatLanguageModel = class {
685
686
  });
686
687
  controller.enqueue({
687
688
  type: "tool-call",
688
- toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils.generateId)(),
689
+ toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils2.generateId)(),
689
690
  toolName: toolCall.function.name,
690
691
  input: toolCall.function.arguments
691
692
  });
@@ -793,7 +794,7 @@ var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_v43.z.union(
793
794
  ]);
794
795
 
795
796
  // src/openai-compatible-completion-language-model.ts
796
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
797
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
797
798
  var import_v45 = require("zod/v4");
798
799
 
799
800
  // src/convert-to-openai-compatible-completion-prompt.ts
@@ -908,7 +909,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
908
909
  this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(
909
910
  errorStructure.errorSchema
910
911
  );
911
- this.failedResponseHandler = (0, import_provider_utils2.createJsonErrorResponseHandler)(errorStructure);
912
+ this.failedResponseHandler = (0, import_provider_utils3.createJsonErrorResponseHandler)(errorStructure);
912
913
  }
913
914
  get provider() {
914
915
  return this.config.provider;
@@ -937,7 +938,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
937
938
  }) {
938
939
  var _a;
939
940
  const warnings = [];
940
- const completionOptions = (_a = await (0, import_provider_utils2.parseProviderOptions)({
941
+ const completionOptions = (_a = await (0, import_provider_utils3.parseProviderOptions)({
941
942
  provider: this.providerOptionsName,
942
943
  providerOptions,
943
944
  schema: openaiCompatibleCompletionProviderOptions
@@ -992,15 +993,15 @@ var OpenAICompatibleCompletionLanguageModel = class {
992
993
  responseHeaders,
993
994
  value: response,
994
995
  rawValue: rawResponse
995
- } = await (0, import_provider_utils2.postJsonToApi)({
996
+ } = await (0, import_provider_utils3.postJsonToApi)({
996
997
  url: this.config.url({
997
998
  path: "/completions",
998
999
  modelId: this.modelId
999
1000
  }),
1000
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
1001
+ headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1001
1002
  body: args,
1002
1003
  failedResponseHandler: this.failedResponseHandler,
1003
- successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
1004
+ successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
1004
1005
  openaiCompatibleCompletionResponseSchema
1005
1006
  ),
1006
1007
  abortSignal: options.abortSignal,
@@ -1036,15 +1037,15 @@ var OpenAICompatibleCompletionLanguageModel = class {
1036
1037
  // only include stream_options when in strict compatibility mode:
1037
1038
  stream_options: this.config.includeUsage ? { include_usage: true } : void 0
1038
1039
  };
1039
- const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
1040
+ const { responseHeaders, value: response } = await (0, import_provider_utils3.postJsonToApi)({
1040
1041
  url: this.config.url({
1041
1042
  path: "/completions",
1042
1043
  modelId: this.modelId
1043
1044
  }),
1044
- headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
1045
+ headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
1045
1046
  body,
1046
1047
  failedResponseHandler: this.failedResponseHandler,
1047
- successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(
1048
+ successfulResponseHandler: (0, import_provider_utils3.createEventSourceResponseHandler)(
1048
1049
  this.chunkSchema
1049
1050
  ),
1050
1051
  abortSignal: options.abortSignal,
@@ -1162,7 +1163,7 @@ var createOpenAICompatibleCompletionChunkSchema = (errorSchema) => import_v45.z.
1162
1163
 
1163
1164
  // src/openai-compatible-embedding-model.ts
1164
1165
  var import_provider5 = require("@ai-sdk/provider");
1165
- var import_provider_utils3 = require("@ai-sdk/provider-utils");
1166
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
1166
1167
  var import_v47 = require("zod/v4");
1167
1168
 
1168
1169
  // src/openai-compatible-embedding-options.ts
@@ -1209,12 +1210,12 @@ var OpenAICompatibleEmbeddingModel = class {
1209
1210
  }) {
1210
1211
  var _a, _b, _c;
1211
1212
  const compatibleOptions = Object.assign(
1212
- (_a = await (0, import_provider_utils3.parseProviderOptions)({
1213
+ (_a = await (0, import_provider_utils4.parseProviderOptions)({
1213
1214
  provider: "openai-compatible",
1214
1215
  providerOptions,
1215
1216
  schema: openaiCompatibleEmbeddingProviderOptions
1216
1217
  })) != null ? _a : {},
1217
- (_b = await (0, import_provider_utils3.parseProviderOptions)({
1218
+ (_b = await (0, import_provider_utils4.parseProviderOptions)({
1218
1219
  provider: this.providerOptionsName,
1219
1220
  providerOptions,
1220
1221
  schema: openaiCompatibleEmbeddingProviderOptions
@@ -1232,12 +1233,12 @@ var OpenAICompatibleEmbeddingModel = class {
1232
1233
  responseHeaders,
1233
1234
  value: response,
1234
1235
  rawValue
1235
- } = await (0, import_provider_utils3.postJsonToApi)({
1236
+ } = await (0, import_provider_utils4.postJsonToApi)({
1236
1237
  url: this.config.url({
1237
1238
  path: "/embeddings",
1238
1239
  modelId: this.modelId
1239
1240
  }),
1240
- headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), headers),
1241
+ headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), headers),
1241
1242
  body: {
1242
1243
  model: this.modelId,
1243
1244
  input: values,
@@ -1245,10 +1246,10 @@ var OpenAICompatibleEmbeddingModel = class {
1245
1246
  dimensions: compatibleOptions.dimensions,
1246
1247
  user: compatibleOptions.user
1247
1248
  },
1248
- failedResponseHandler: (0, import_provider_utils3.createJsonErrorResponseHandler)(
1249
+ failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
1249
1250
  (_c = this.config.errorStructure) != null ? _c : defaultOpenAICompatibleErrorStructure
1250
1251
  ),
1251
- successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
1252
+ successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
1252
1253
  openaiTextEmbeddingResponseSchema
1253
1254
  ),
1254
1255
  abortSignal,
@@ -1269,7 +1270,7 @@ var openaiTextEmbeddingResponseSchema = import_v47.z.object({
1269
1270
  });
1270
1271
 
1271
1272
  // src/openai-compatible-image-model.ts
1272
- var import_provider_utils4 = require("@ai-sdk/provider-utils");
1273
+ var import_provider_utils5 = require("@ai-sdk/provider-utils");
1273
1274
  var import_v48 = require("zod/v4");
1274
1275
  var OpenAICompatibleImageModel = class {
1275
1276
  constructor(modelId, config) {
@@ -1304,12 +1305,12 @@ var OpenAICompatibleImageModel = class {
1304
1305
  warnings.push({ type: "unsupported-setting", setting: "seed" });
1305
1306
  }
1306
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();
1307
- const { value: response, responseHeaders } = await (0, import_provider_utils4.postJsonToApi)({
1308
+ const { value: response, responseHeaders } = await (0, import_provider_utils5.postJsonToApi)({
1308
1309
  url: this.config.url({
1309
1310
  path: "/images/generations",
1310
1311
  modelId: this.modelId
1311
1312
  }),
1312
- headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), headers),
1313
+ headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), headers),
1313
1314
  body: {
1314
1315
  model: this.modelId,
1315
1316
  prompt,
@@ -1318,10 +1319,10 @@ var OpenAICompatibleImageModel = class {
1318
1319
  ...(_d = providerOptions.openai) != null ? _d : {},
1319
1320
  response_format: "b64_json"
1320
1321
  },
1321
- failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
1322
+ failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)(
1322
1323
  (_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
1323
1324
  ),
1324
- successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
1325
+ successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(
1325
1326
  openaiCompatibleImageResponseSchema
1326
1327
  ),
1327
1328
  abortSignal,
@@ -1343,9 +1344,9 @@ var openaiCompatibleImageResponseSchema = import_v48.z.object({
1343
1344
  });
1344
1345
 
1345
1346
  // src/openai-compatible-provider.ts
1346
- var import_provider_utils5 = require("@ai-sdk/provider-utils");
1347
+ var import_provider_utils6 = require("@ai-sdk/provider-utils");
1347
1348
  function createOpenAICompatible(options) {
1348
- const baseURL = (0, import_provider_utils5.withoutTrailingSlash)(options.baseURL);
1349
+ const baseURL = (0, import_provider_utils6.withoutTrailingSlash)(options.baseURL);
1349
1350
  const providerName = options.name;
1350
1351
  const getHeaders = () => ({
1351
1352
  ...options.apiKey && { Authorization: `Bearer ${options.apiKey}` },