@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 +7 -0
- package/dist/index.js +52 -54
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -18
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +2 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/index.mjs +2 -1
- package/dist/internal/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
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,
|
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,
|
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,
|
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,
|
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,
|
390
|
+
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
|
390
391
|
body: args,
|
391
392
|
failedResponseHandler: this.failedResponseHandler,
|
392
|
-
successfulResponseHandler: (0,
|
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,
|
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,
|
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,
|
470
|
+
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
|
470
471
|
body,
|
471
472
|
failedResponseHandler: this.failedResponseHandler,
|
472
|
-
successfulResponseHandler: (0,
|
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
|
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
|
-
|
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
|
-
} =
|
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 = (
|
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 (((
|
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: (
|
615
|
+
arguments: (_c = toolCallDelta.function.arguments) != null ? _c : ""
|
616
616
|
},
|
617
617
|
hasFinished: false
|
618
618
|
};
|
619
619
|
const toolCall2 = toolCalls[index];
|
620
|
-
if (((
|
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,
|
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: (
|
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 (((
|
649
|
-
toolCall.function.arguments += (
|
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: (
|
654
|
+
delta: (_j = toolCallDelta.function.arguments) != null ? _j : ""
|
655
655
|
});
|
656
|
-
if (((
|
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: (
|
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,
|
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
|
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,
|
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,
|
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,
|
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,
|
1001
|
+
headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
|
1004
1002
|
body: args,
|
1005
1003
|
failedResponseHandler: this.failedResponseHandler,
|
1006
|
-
successfulResponseHandler: (0,
|
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,
|
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,
|
1045
|
+
headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
|
1048
1046
|
body,
|
1049
1047
|
failedResponseHandler: this.failedResponseHandler,
|
1050
|
-
successfulResponseHandler: (0,
|
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
|
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,
|
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,
|
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,
|
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,
|
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,
|
1249
|
+
failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)(
|
1252
1250
|
(_c = this.config.errorStructure) != null ? _c : defaultOpenAICompatibleErrorStructure
|
1253
1251
|
),
|
1254
|
-
successfulResponseHandler: (0,
|
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
|
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,
|
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,
|
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,
|
1322
|
+
failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)(
|
1325
1323
|
(_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
|
1326
1324
|
),
|
1327
|
-
successfulResponseHandler: (0,
|
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
|
1347
|
+
var import_provider_utils6 = require("@ai-sdk/provider-utils");
|
1350
1348
|
function createOpenAICompatible(options) {
|
1351
|
-
const baseURL = (0,
|
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}` },
|