@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/CHANGELOG.md +235 -8
- package/README.md +2 -0
- package/dist/index.d.ts +39 -6
- package/dist/index.js +420 -379
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +1 -1
- package/dist/internal/index.js +28 -46
- package/dist/internal/index.js.map +1 -1
- package/package.json +9 -12
- package/src/chat/convert-to-openai-compatible-chat-messages.ts +8 -1
- package/src/chat/openai-compatible-api-types.ts +2 -4
- package/src/chat/openai-compatible-chat-language-model.ts +86 -182
- package/src/completion/openai-compatible-completion-language-model.ts +45 -9
- package/src/embedding/openai-compatible-embedding-model.ts +30 -4
- package/src/image/openai-compatible-image-model.ts +31 -9
- package/src/utils/to-camel-case.ts +43 -0
- package/dist/index.d.mts +0 -290
- package/dist/index.mjs +0 -1742
- package/dist/index.mjs.map +0 -1
- package/dist/internal/index.d.mts +0 -193
- package/dist/internal/index.mjs +0 -340
- package/dist/internal/index.mjs.map +0 -1
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
var openaiCompatibleErrorDataSchema =
|
|
40
|
-
error:
|
|
41
|
-
message:
|
|
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:
|
|
46
|
-
param:
|
|
47
|
-
code:
|
|
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
|
-
|
|
96
|
-
|
|
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,${
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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,${
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
326
|
-
var openaiCompatibleLanguageModelChatOptions =
|
|
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:
|
|
349
|
+
user: z2.string().optional(),
|
|
332
350
|
/**
|
|
333
351
|
* Reasoning effort for reasoning models. Defaults to `medium`.
|
|
334
352
|
*/
|
|
335
|
-
reasoningEffort:
|
|
353
|
+
reasoningEffort: z2.string().optional(),
|
|
336
354
|
/**
|
|
337
355
|
* Controls the verbosity of the generated text. Defaults to `medium`.
|
|
338
356
|
*/
|
|
339
|
-
textVerbosity:
|
|
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:
|
|
365
|
+
strictJsonSchema: z2.boolean().optional()
|
|
348
366
|
});
|
|
349
367
|
|
|
350
368
|
// src/chat/openai-compatible-prepare-tools.ts
|
|
351
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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: "
|
|
461
|
-
|
|
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
|
|
505
|
+
(_a = await parseProviderOptions({
|
|
467
506
|
provider: "openaiCompatible",
|
|
468
507
|
providerOptions,
|
|
469
508
|
schema: openaiCompatibleLanguageModelChatOptions
|
|
470
509
|
})) != null ? _a : {},
|
|
471
|
-
(_b = await
|
|
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 = (
|
|
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: (
|
|
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
|
-
|
|
522
|
-
|
|
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
|
|
598
|
+
} = await postJsonToApi({
|
|
549
599
|
url: this.config.url({
|
|
550
600
|
path: "/chat/completions",
|
|
551
601
|
modelId: this.modelId
|
|
552
602
|
}),
|
|
553
|
-
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:
|
|
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 = (
|
|
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 = (
|
|
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: (
|
|
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
|
-
[
|
|
635
|
+
[metadataKey]: { thoughtSignature }
|
|
586
636
|
}
|
|
587
637
|
} : {}
|
|
588
638
|
});
|
|
589
639
|
}
|
|
590
640
|
}
|
|
591
641
|
const providerMetadata = {
|
|
592
|
-
[
|
|
593
|
-
...await ((
|
|
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 = (
|
|
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[
|
|
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[
|
|
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: (
|
|
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({
|
|
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
|
|
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: (
|
|
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:
|
|
691
|
+
successfulResponseHandler: createEventSourceResponseHandler(
|
|
640
692
|
this.chunkSchema
|
|
641
693
|
),
|
|
642
694
|
abortSignal: options.abortSignal,
|
|
643
695
|
fetch: this.config.fetch
|
|
644
696
|
});
|
|
645
|
-
const
|
|
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,
|
|
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 = (
|
|
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
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
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,
|
|
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
|
-
|
|
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 (((
|
|
874
|
-
providerMetadata[providerOptionsName].acceptedPredictionTokens = (
|
|
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 (((
|
|
877
|
-
providerMetadata[providerOptionsName].rejectedPredictionTokens = (
|
|
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 =
|
|
894
|
-
prompt_tokens:
|
|
895
|
-
completion_tokens:
|
|
896
|
-
total_tokens:
|
|
897
|
-
prompt_tokens_details:
|
|
898
|
-
cached_tokens:
|
|
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:
|
|
901
|
-
reasoning_tokens:
|
|
902
|
-
accepted_prediction_tokens:
|
|
903
|
-
rejected_prediction_tokens:
|
|
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 =
|
|
907
|
-
id:
|
|
908
|
-
created:
|
|
909
|
-
model:
|
|
910
|
-
choices:
|
|
911
|
-
|
|
912
|
-
message:
|
|
913
|
-
role:
|
|
914
|
-
content:
|
|
915
|
-
reasoning_content:
|
|
916
|
-
reasoning:
|
|
917
|
-
tool_calls:
|
|
918
|
-
|
|
919
|
-
id:
|
|
920
|
-
function:
|
|
921
|
-
name:
|
|
922
|
-
arguments:
|
|
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:
|
|
926
|
-
google:
|
|
927
|
-
thought_signature:
|
|
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:
|
|
884
|
+
finish_reason: z3.string().nullish()
|
|
934
885
|
})
|
|
935
886
|
),
|
|
936
887
|
usage: openaiCompatibleTokenUsageSchema
|
|
937
888
|
});
|
|
938
|
-
var chunkBaseSchema =
|
|
939
|
-
id:
|
|
940
|
-
created:
|
|
941
|
-
model:
|
|
942
|
-
choices:
|
|
943
|
-
|
|
944
|
-
delta:
|
|
945
|
-
role:
|
|
946
|
-
content:
|
|
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:
|
|
950
|
-
reasoning:
|
|
951
|
-
tool_calls:
|
|
952
|
-
|
|
953
|
-
index:
|
|
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:
|
|
956
|
-
function:
|
|
957
|
-
name:
|
|
958
|
-
arguments:
|
|
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:
|
|
962
|
-
google:
|
|
963
|
-
thought_signature:
|
|
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:
|
|
920
|
+
finish_reason: z3.string().nullish()
|
|
970
921
|
})
|
|
971
922
|
),
|
|
972
923
|
usage: openaiCompatibleTokenUsageSchema
|
|
973
924
|
});
|
|
974
|
-
var createOpenAICompatibleChatChunkSchema = (errorSchema) =>
|
|
925
|
+
var createOpenAICompatibleChatChunkSchema = (errorSchema) => z3.union([chunkBaseSchema, errorSchema]);
|
|
975
926
|
|
|
976
927
|
// src/completion/openai-compatible-completion-language-model.ts
|
|
977
|
-
|
|
978
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1124
|
-
var openaiCompatibleLanguageModelCompletionOptions =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 = (
|
|
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
|
-
|
|
1189
|
-
|
|
1164
|
+
warnIfDeprecatedProviderOptionsKey({
|
|
1165
|
+
rawName: this.providerOptionsName,
|
|
1190
1166
|
providerOptions,
|
|
1191
|
-
|
|
1192
|
-
})
|
|
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 (
|
|
1232
|
+
} = await postJsonToApi2({
|
|
1243
1233
|
url: this.config.url({
|
|
1244
1234
|
path: "/completions",
|
|
1245
1235
|
modelId: this.modelId
|
|
1246
1236
|
}),
|
|
1247
|
-
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: (
|
|
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 (
|
|
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: (
|
|
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: (
|
|
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
|
|
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: (
|
|
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 =
|
|
1374
|
-
prompt_tokens:
|
|
1375
|
-
completion_tokens:
|
|
1376
|
-
total_tokens:
|
|
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 =
|
|
1379
|
-
id:
|
|
1380
|
-
created:
|
|
1381
|
-
model:
|
|
1382
|
-
choices:
|
|
1383
|
-
|
|
1384
|
-
text:
|
|
1385
|
-
finish_reason:
|
|
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) =>
|
|
1391
|
-
|
|
1392
|
-
id:
|
|
1393
|
-
created:
|
|
1394
|
-
model:
|
|
1395
|
-
choices:
|
|
1396
|
-
|
|
1397
|
-
text:
|
|
1398
|
-
finish_reason:
|
|
1399
|
-
index:
|
|
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
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
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
|
-
|
|
1414
|
-
var openaiCompatibleEmbeddingModelOptions =
|
|
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:
|
|
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:
|
|
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 (
|
|
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: "
|
|
1464
|
-
|
|
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 (
|
|
1486
|
+
(_a = await parseProviderOptions3({
|
|
1470
1487
|
provider: "openaiCompatible",
|
|
1471
1488
|
providerOptions,
|
|
1472
1489
|
schema: openaiCompatibleEmbeddingModelOptions
|
|
1473
1490
|
})) != null ? _a : {},
|
|
1474
|
-
(_b = await (
|
|
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
|
|
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 (
|
|
1509
|
+
} = await postJsonToApi3({
|
|
1493
1510
|
url: this.config.url({
|
|
1494
1511
|
path: "/embeddings",
|
|
1495
1512
|
modelId: this.modelId
|
|
1496
1513
|
}),
|
|
1497
|
-
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: (
|
|
1506
|
-
(
|
|
1522
|
+
failedResponseHandler: createJsonErrorResponseHandler3(
|
|
1523
|
+
(_e = this.config.errorStructure) != null ? _e : defaultOpenAICompatibleErrorStructure
|
|
1507
1524
|
),
|
|
1508
|
-
successfulResponseHandler: (
|
|
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 =
|
|
1524
|
-
data:
|
|
1525
|
-
usage:
|
|
1526
|
-
providerMetadata:
|
|
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
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
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
|
-
|
|
1549
|
-
|
|
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
|
|
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: (
|
|
1588
|
-
formData:
|
|
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: (
|
|
1598
|
-
(
|
|
1639
|
+
failedResponseHandler: createJsonErrorResponseHandler4(
|
|
1640
|
+
(_f = this.config.errorStructure) != null ? _f : defaultOpenAICompatibleErrorStructure
|
|
1599
1641
|
),
|
|
1600
|
-
successfulResponseHandler: (
|
|
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 (
|
|
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: (
|
|
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: (
|
|
1631
|
-
(
|
|
1672
|
+
failedResponseHandler: createJsonErrorResponseHandler4(
|
|
1673
|
+
(_i = this.config.errorStructure) != null ? _i : defaultOpenAICompatibleErrorStructure
|
|
1632
1674
|
),
|
|
1633
|
-
successfulResponseHandler: (
|
|
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 =
|
|
1651
|
-
data:
|
|
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
|
|
1697
|
+
return downloadBlob(file.url);
|
|
1656
1698
|
}
|
|
1657
|
-
const data = file.data instanceof Uint8Array ? 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
|
-
|
|
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.
|
|
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 =
|
|
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 = () =>
|
|
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
|
-
|
|
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
|