modelfusion 0.65.0 → 0.66.1
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/model-function/generate-text/streamText.cjs +21 -1
- package/model-function/generate-text/streamText.js +21 -1
- package/model-provider/openai/OpenAICompletionModel.cjs +18 -8
- package/model-provider/openai/OpenAICompletionModel.d.ts +17 -11
- package/model-provider/openai/OpenAICompletionModel.js +18 -8
- package/model-provider/openai/chat/OpenAIChatModel.cjs +22 -12
- package/model-provider/openai/chat/OpenAIChatModel.d.ts +27 -25
- package/model-provider/openai/chat/OpenAIChatModel.js +22 -12
- package/model-provider/openai/chat/OpenAIChatStreamIterable.cjs +3 -2
- package/model-provider/openai/chat/OpenAIChatStreamIterable.js +3 -2
- package/package.json +1 -1
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.streamText = void 0;
|
4
4
|
const executeStreamCall_js_1 = require("../executeStreamCall.cjs");
|
5
5
|
async function streamText(model, prompt, options) {
|
6
|
+
const shouldTrimWhitespace = model.settings.trimWhitespace ?? true;
|
6
7
|
let accumulatedText = "";
|
7
8
|
let lastFullDelta;
|
9
|
+
let isFirstDelta = true;
|
10
|
+
let trailingWhitespace = "";
|
8
11
|
const fullResponse = await (0, executeStreamCall_js_1.executeStreamCall)({
|
9
12
|
functionType: "stream-text",
|
10
13
|
input: prompt,
|
@@ -13,8 +16,25 @@ async function streamText(model, prompt, options) {
|
|
13
16
|
startStream: async (options) => model.doStreamText(prompt, options),
|
14
17
|
processDelta: (delta) => {
|
15
18
|
lastFullDelta = delta.fullDelta;
|
16
|
-
|
19
|
+
let textDelta = delta.valueDelta;
|
17
20
|
if (textDelta != null && textDelta.length > 0) {
|
21
|
+
if (shouldTrimWhitespace) {
|
22
|
+
if (isFirstDelta) {
|
23
|
+
// remove leading whitespace:
|
24
|
+
textDelta = textDelta.trimStart();
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
// restore trailing whitespace from previous chunk:
|
28
|
+
textDelta = trailingWhitespace + textDelta;
|
29
|
+
}
|
30
|
+
// trim trailing whitespace and store it for the next chunk:
|
31
|
+
const trailingWhitespaceMatch = textDelta.match(/\s+$/);
|
32
|
+
trailingWhitespace = trailingWhitespaceMatch
|
33
|
+
? trailingWhitespaceMatch[0]
|
34
|
+
: "";
|
35
|
+
textDelta = textDelta.trimEnd();
|
36
|
+
}
|
37
|
+
isFirstDelta = false;
|
18
38
|
accumulatedText += textDelta;
|
19
39
|
return textDelta;
|
20
40
|
}
|
@@ -1,7 +1,10 @@
|
|
1
1
|
import { executeStreamCall } from "../executeStreamCall.js";
|
2
2
|
export async function streamText(model, prompt, options) {
|
3
|
+
const shouldTrimWhitespace = model.settings.trimWhitespace ?? true;
|
3
4
|
let accumulatedText = "";
|
4
5
|
let lastFullDelta;
|
6
|
+
let isFirstDelta = true;
|
7
|
+
let trailingWhitespace = "";
|
5
8
|
const fullResponse = await executeStreamCall({
|
6
9
|
functionType: "stream-text",
|
7
10
|
input: prompt,
|
@@ -10,8 +13,25 @@ export async function streamText(model, prompt, options) {
|
|
10
13
|
startStream: async (options) => model.doStreamText(prompt, options),
|
11
14
|
processDelta: (delta) => {
|
12
15
|
lastFullDelta = delta.fullDelta;
|
13
|
-
|
16
|
+
let textDelta = delta.valueDelta;
|
14
17
|
if (textDelta != null && textDelta.length > 0) {
|
18
|
+
if (shouldTrimWhitespace) {
|
19
|
+
if (isFirstDelta) {
|
20
|
+
// remove leading whitespace:
|
21
|
+
textDelta = textDelta.trimStart();
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
// restore trailing whitespace from previous chunk:
|
25
|
+
textDelta = trailingWhitespace + textDelta;
|
26
|
+
}
|
27
|
+
// trim trailing whitespace and store it for the next chunk:
|
28
|
+
const trailingWhitespaceMatch = textDelta.match(/\s+$/);
|
29
|
+
trailingWhitespace = trailingWhitespaceMatch
|
30
|
+
? trailingWhitespaceMatch[0]
|
31
|
+
: "";
|
32
|
+
textDelta = textDelta.trimEnd();
|
33
|
+
}
|
34
|
+
isFirstDelta = false;
|
15
35
|
accumulatedText += textDelta;
|
16
36
|
return textDelta;
|
17
37
|
}
|
@@ -212,6 +212,7 @@ class OpenAICompletionModel extends AbstractModel_js_1.AbstractModel {
|
|
212
212
|
"frequencyPenalty",
|
213
213
|
"bestOf",
|
214
214
|
"logitBias",
|
215
|
+
"seed",
|
215
216
|
];
|
216
217
|
return Object.fromEntries(Object.entries(this.settings).filter(([key]) => eventSettingProperties.includes(key)));
|
217
218
|
}
|
@@ -266,22 +267,26 @@ class OpenAICompletionModel extends AbstractModel_js_1.AbstractModel {
|
|
266
267
|
exports.OpenAICompletionModel = OpenAICompletionModel;
|
267
268
|
const OpenAICompletionResponseSchema = zod_1.z.object({
|
268
269
|
id: zod_1.z.string(),
|
269
|
-
object: zod_1.z.literal("text_completion"),
|
270
|
-
created: zod_1.z.number(),
|
271
|
-
model: zod_1.z.string(),
|
272
270
|
choices: zod_1.z.array(zod_1.z.object({
|
273
|
-
|
271
|
+
finish_reason: zod_1.z
|
272
|
+
.enum(["stop", "length", "content_filter"])
|
273
|
+
.optional()
|
274
|
+
.nullable(),
|
274
275
|
index: zod_1.z.number(),
|
275
276
|
logprobs: zod_1.z.nullable(zod_1.z.any()),
|
276
|
-
|
277
|
+
text: zod_1.z.string(),
|
277
278
|
})),
|
279
|
+
created: zod_1.z.number(),
|
280
|
+
model: zod_1.z.string(),
|
281
|
+
system_fingerprint: zod_1.z.string().optional(),
|
282
|
+
object: zod_1.z.literal("text_completion"),
|
278
283
|
usage: zod_1.z.object({
|
279
284
|
prompt_tokens: zod_1.z.number(),
|
280
285
|
completion_tokens: zod_1.z.number(),
|
281
286
|
total_tokens: zod_1.z.number(),
|
282
287
|
}),
|
283
288
|
});
|
284
|
-
async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration_js_1.OpenAIApiConfiguration(), abortSignal, responseFormat, model, prompt, suffix, maxTokens, temperature, topP, n, logprobs, echo, stop, presencePenalty, frequencyPenalty, bestOf, logitBias, user, }) {
|
289
|
+
async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration_js_1.OpenAIApiConfiguration(), abortSignal, responseFormat, model, prompt, suffix, maxTokens, temperature, topP, n, logprobs, echo, stop, presencePenalty, frequencyPenalty, bestOf, logitBias, seed, user, }) {
|
285
290
|
// empty arrays are not allowed for stop:
|
286
291
|
if (stop != null && Array.isArray(stop) && stop.length === 0) {
|
287
292
|
stop = undefined;
|
@@ -301,6 +306,7 @@ async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration_js_1.O
|
|
301
306
|
logprobs,
|
302
307
|
echo,
|
303
308
|
stop,
|
309
|
+
seed,
|
304
310
|
presence_penalty: presencePenalty,
|
305
311
|
frequency_penalty: frequencyPenalty,
|
306
312
|
best_of: bestOf,
|
@@ -332,13 +338,17 @@ exports.OpenAITextResponseFormat = {
|
|
332
338
|
const textResponseStreamEventSchema = zod_1.z.object({
|
333
339
|
choices: zod_1.z.array(zod_1.z.object({
|
334
340
|
text: zod_1.z.string(),
|
335
|
-
finish_reason: zod_1.z
|
341
|
+
finish_reason: zod_1.z
|
342
|
+
.enum(["stop", "length", "content_filter"])
|
343
|
+
.optional()
|
344
|
+
.nullable(),
|
336
345
|
index: zod_1.z.number(),
|
337
346
|
})),
|
338
347
|
created: zod_1.z.number(),
|
339
348
|
id: zod_1.z.string(),
|
340
349
|
model: zod_1.z.string(),
|
341
|
-
|
350
|
+
system_fingerprint: zod_1.z.string().optional(),
|
351
|
+
object: zod_1.z.literal("text_completion"),
|
342
352
|
});
|
343
353
|
async function createOpenAITextFullDeltaIterableQueue(stream) {
|
344
354
|
const queue = new AsyncQueue_js_1.AsyncQueue();
|
@@ -112,6 +112,7 @@ export interface OpenAICompletionCallSettings {
|
|
112
112
|
frequencyPenalty?: number;
|
113
113
|
bestOf?: number;
|
114
114
|
logitBias?: Record<number, number>;
|
115
|
+
seed?: number | null;
|
115
116
|
}
|
116
117
|
export interface OpenAICompletionModelSettings extends TextGenerationModelSettings, Omit<OpenAICompletionCallSettings, "stop" | "maxTokens"> {
|
117
118
|
isUserIdForwardingEnabled?: boolean;
|
@@ -157,11 +158,12 @@ export declare class OpenAICompletionModel extends AbstractModel<OpenAICompletio
|
|
157
158
|
id: string;
|
158
159
|
choices: {
|
159
160
|
text: string;
|
160
|
-
finish_reason: string;
|
161
161
|
index: number;
|
162
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
162
163
|
logprobs?: any;
|
163
164
|
}[];
|
164
165
|
created: number;
|
166
|
+
system_fingerprint?: string | undefined;
|
165
167
|
};
|
166
168
|
text: string;
|
167
169
|
usage: {
|
@@ -187,25 +189,26 @@ export declare class OpenAICompletionModel extends AbstractModel<OpenAICompletio
|
|
187
189
|
}
|
188
190
|
declare const OpenAICompletionResponseSchema: z.ZodObject<{
|
189
191
|
id: z.ZodString;
|
190
|
-
object: z.ZodLiteral<"text_completion">;
|
191
|
-
created: z.ZodNumber;
|
192
|
-
model: z.ZodString;
|
193
192
|
choices: z.ZodArray<z.ZodObject<{
|
194
|
-
|
193
|
+
finish_reason: z.ZodNullable<z.ZodOptional<z.ZodEnum<["stop", "length", "content_filter"]>>>;
|
195
194
|
index: z.ZodNumber;
|
196
195
|
logprobs: z.ZodNullable<z.ZodAny>;
|
197
|
-
|
196
|
+
text: z.ZodString;
|
198
197
|
}, "strip", z.ZodTypeAny, {
|
199
198
|
text: string;
|
200
|
-
finish_reason: string;
|
201
199
|
index: number;
|
200
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
202
201
|
logprobs?: any;
|
203
202
|
}, {
|
204
203
|
text: string;
|
205
|
-
finish_reason: string;
|
206
204
|
index: number;
|
205
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
207
206
|
logprobs?: any;
|
208
207
|
}>, "many">;
|
208
|
+
created: z.ZodNumber;
|
209
|
+
model: z.ZodString;
|
210
|
+
system_fingerprint: z.ZodOptional<z.ZodString>;
|
211
|
+
object: z.ZodLiteral<"text_completion">;
|
209
212
|
usage: z.ZodObject<{
|
210
213
|
prompt_tokens: z.ZodNumber;
|
211
214
|
completion_tokens: z.ZodNumber;
|
@@ -230,11 +233,12 @@ declare const OpenAICompletionResponseSchema: z.ZodObject<{
|
|
230
233
|
id: string;
|
231
234
|
choices: {
|
232
235
|
text: string;
|
233
|
-
finish_reason: string;
|
234
236
|
index: number;
|
237
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
235
238
|
logprobs?: any;
|
236
239
|
}[];
|
237
240
|
created: number;
|
241
|
+
system_fingerprint?: string | undefined;
|
238
242
|
}, {
|
239
243
|
object: "text_completion";
|
240
244
|
usage: {
|
@@ -246,11 +250,12 @@ declare const OpenAICompletionResponseSchema: z.ZodObject<{
|
|
246
250
|
id: string;
|
247
251
|
choices: {
|
248
252
|
text: string;
|
249
|
-
finish_reason: string;
|
250
253
|
index: number;
|
254
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
251
255
|
logprobs?: any;
|
252
256
|
}[];
|
253
257
|
created: number;
|
258
|
+
system_fingerprint?: string | undefined;
|
254
259
|
}>;
|
255
260
|
export type OpenAICompletionResponse = z.infer<typeof OpenAICompletionResponseSchema>;
|
256
261
|
export type OpenAITextResponseFormatType<T> = {
|
@@ -274,11 +279,12 @@ export declare const OpenAITextResponseFormat: {
|
|
274
279
|
id: string;
|
275
280
|
choices: {
|
276
281
|
text: string;
|
277
|
-
finish_reason: string;
|
278
282
|
index: number;
|
283
|
+
finish_reason?: "length" | "stop" | "content_filter" | null | undefined;
|
279
284
|
logprobs?: any;
|
280
285
|
}[];
|
281
286
|
created: number;
|
287
|
+
system_fingerprint?: string | undefined;
|
282
288
|
}>;
|
283
289
|
};
|
284
290
|
/**
|
@@ -206,6 +206,7 @@ export class OpenAICompletionModel extends AbstractModel {
|
|
206
206
|
"frequencyPenalty",
|
207
207
|
"bestOf",
|
208
208
|
"logitBias",
|
209
|
+
"seed",
|
209
210
|
];
|
210
211
|
return Object.fromEntries(Object.entries(this.settings).filter(([key]) => eventSettingProperties.includes(key)));
|
211
212
|
}
|
@@ -259,22 +260,26 @@ export class OpenAICompletionModel extends AbstractModel {
|
|
259
260
|
}
|
260
261
|
const OpenAICompletionResponseSchema = z.object({
|
261
262
|
id: z.string(),
|
262
|
-
object: z.literal("text_completion"),
|
263
|
-
created: z.number(),
|
264
|
-
model: z.string(),
|
265
263
|
choices: z.array(z.object({
|
266
|
-
|
264
|
+
finish_reason: z
|
265
|
+
.enum(["stop", "length", "content_filter"])
|
266
|
+
.optional()
|
267
|
+
.nullable(),
|
267
268
|
index: z.number(),
|
268
269
|
logprobs: z.nullable(z.any()),
|
269
|
-
|
270
|
+
text: z.string(),
|
270
271
|
})),
|
272
|
+
created: z.number(),
|
273
|
+
model: z.string(),
|
274
|
+
system_fingerprint: z.string().optional(),
|
275
|
+
object: z.literal("text_completion"),
|
271
276
|
usage: z.object({
|
272
277
|
prompt_tokens: z.number(),
|
273
278
|
completion_tokens: z.number(),
|
274
279
|
total_tokens: z.number(),
|
275
280
|
}),
|
276
281
|
});
|
277
|
-
async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration(), abortSignal, responseFormat, model, prompt, suffix, maxTokens, temperature, topP, n, logprobs, echo, stop, presencePenalty, frequencyPenalty, bestOf, logitBias, user, }) {
|
282
|
+
async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration(), abortSignal, responseFormat, model, prompt, suffix, maxTokens, temperature, topP, n, logprobs, echo, stop, presencePenalty, frequencyPenalty, bestOf, logitBias, seed, user, }) {
|
278
283
|
// empty arrays are not allowed for stop:
|
279
284
|
if (stop != null && Array.isArray(stop) && stop.length === 0) {
|
280
285
|
stop = undefined;
|
@@ -294,6 +299,7 @@ async function callOpenAICompletionAPI({ api = new OpenAIApiConfiguration(), abo
|
|
294
299
|
logprobs,
|
295
300
|
echo,
|
296
301
|
stop,
|
302
|
+
seed,
|
297
303
|
presence_penalty: presencePenalty,
|
298
304
|
frequency_penalty: frequencyPenalty,
|
299
305
|
best_of: bestOf,
|
@@ -325,13 +331,17 @@ export const OpenAITextResponseFormat = {
|
|
325
331
|
const textResponseStreamEventSchema = z.object({
|
326
332
|
choices: z.array(z.object({
|
327
333
|
text: z.string(),
|
328
|
-
finish_reason: z
|
334
|
+
finish_reason: z
|
335
|
+
.enum(["stop", "length", "content_filter"])
|
336
|
+
.optional()
|
337
|
+
.nullable(),
|
329
338
|
index: z.number(),
|
330
339
|
})),
|
331
340
|
created: z.number(),
|
332
341
|
id: z.string(),
|
333
342
|
model: z.string(),
|
334
|
-
|
343
|
+
system_fingerprint: z.string().optional(),
|
344
|
+
object: z.literal("text_completion"),
|
335
345
|
});
|
336
346
|
async function createOpenAITextFullDeltaIterableQueue(stream) {
|
337
347
|
const queue = new AsyncQueue();
|
@@ -39,6 +39,8 @@ exports.OPENAI_CHAT_MODELS = {
|
|
39
39
|
contextWindowSize: 8192,
|
40
40
|
promptTokenCostInMillicents: 3,
|
41
41
|
completionTokenCostInMillicents: 6,
|
42
|
+
fineTunedPromptTokenCostInMillicents: null,
|
43
|
+
fineTunedCompletionTokenCostInMillicents: null,
|
42
44
|
},
|
43
45
|
"gpt-4-1106-preview": {
|
44
46
|
contextWindowSize: 128000,
|
@@ -115,7 +117,7 @@ function getOpenAIChatModelInformation(model) {
|
|
115
117
|
// Extract the base model from the fine-tuned model:
|
116
118
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
117
119
|
const [_, baseModel, ___, ____, _____] = model.split(":");
|
118
|
-
if (["gpt-3.5-turbo", "gpt-3.5-turbo-0613"].includes(baseModel)) {
|
120
|
+
if (["gpt-3.5-turbo", "gpt-3.5-turbo-0613", "gpt-4-0613"].includes(baseModel)) {
|
119
121
|
const baseModelInformation = exports.OPENAI_CHAT_MODELS[baseModel];
|
120
122
|
return {
|
121
123
|
baseModel: baseModel,
|
@@ -133,11 +135,14 @@ const isOpenAIChatModel = (model) => model in exports.OPENAI_CHAT_MODELS ||
|
|
133
135
|
model.startsWith("ft:gpt-3.5-turbo:");
|
134
136
|
exports.isOpenAIChatModel = isOpenAIChatModel;
|
135
137
|
const calculateOpenAIChatCostInMillicents = ({ model, response, }) => {
|
136
|
-
const
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
138
|
+
const { promptTokenCostInMillicents, completionTokenCostInMillicents } = getOpenAIChatModelInformation(model);
|
139
|
+
// null: when cost is unknown, e.g. for fine-tuned models where the price is not yet known
|
140
|
+
if (promptTokenCostInMillicents == null ||
|
141
|
+
completionTokenCostInMillicents == null) {
|
142
|
+
return null;
|
143
|
+
}
|
144
|
+
return (response.usage.prompt_tokens * promptTokenCostInMillicents +
|
145
|
+
response.usage.completion_tokens * completionTokenCostInMillicents);
|
141
146
|
};
|
142
147
|
exports.calculateOpenAIChatCostInMillicents = calculateOpenAIChatCostInMillicents;
|
143
148
|
/**
|
@@ -234,6 +239,8 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
234
239
|
"presencePenalty",
|
235
240
|
"frequencyPenalty",
|
236
241
|
"logitBias",
|
242
|
+
"seed",
|
243
|
+
"responseFormat",
|
237
244
|
];
|
238
245
|
return Object.fromEntries(Object.entries(this.settings).filter(([key]) => eventSettingProperties.includes(key)));
|
239
246
|
}
|
@@ -388,10 +395,6 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
388
395
|
exports.OpenAIChatModel = OpenAIChatModel;
|
389
396
|
const openAIChatResponseSchema = zod_1.z.object({
|
390
397
|
id: zod_1.z.string(),
|
391
|
-
object: zod_1.z.literal("chat.completion"),
|
392
|
-
created: zod_1.z.number(),
|
393
|
-
model: zod_1.z.string(),
|
394
|
-
system_fingerprint: zod_1.z.string(),
|
395
398
|
choices: zod_1.z.array(zod_1.z.object({
|
396
399
|
message: zod_1.z.object({
|
397
400
|
role: zod_1.z.literal("assistant"),
|
@@ -405,14 +408,21 @@ const openAIChatResponseSchema = zod_1.z.object({
|
|
405
408
|
}),
|
406
409
|
index: zod_1.z.number(),
|
407
410
|
logprobs: zod_1.z.nullable(zod_1.z.any()),
|
408
|
-
finish_reason: zod_1.z
|
411
|
+
finish_reason: zod_1.z
|
412
|
+
.enum([
|
409
413
|
"stop",
|
410
414
|
"length",
|
411
415
|
"tool_calls",
|
412
416
|
"content_filter",
|
413
417
|
"function_call",
|
414
|
-
])
|
418
|
+
])
|
419
|
+
.optional()
|
420
|
+
.nullable(),
|
415
421
|
})),
|
422
|
+
created: zod_1.z.number(),
|
423
|
+
model: zod_1.z.string(),
|
424
|
+
system_fingerprint: zod_1.z.string().optional(),
|
425
|
+
object: zod_1.z.literal("chat.completion"),
|
416
426
|
usage: zod_1.z.object({
|
417
427
|
prompt_tokens: zod_1.z.number(),
|
418
428
|
completion_tokens: zod_1.z.number(),
|
@@ -27,6 +27,8 @@ export declare const OPENAI_CHAT_MODELS: {
|
|
27
27
|
contextWindowSize: number;
|
28
28
|
promptTokenCostInMillicents: number;
|
29
29
|
completionTokenCostInMillicents: number;
|
30
|
+
fineTunedPromptTokenCostInMillicents: null;
|
31
|
+
fineTunedCompletionTokenCostInMillicents: null;
|
30
32
|
};
|
31
33
|
"gpt-4-1106-preview": {
|
32
34
|
contextWindowSize: number;
|
@@ -92,10 +94,10 @@ export declare function getOpenAIChatModelInformation(model: OpenAIChatModelType
|
|
92
94
|
baseModel: OpenAIChatBaseModelType;
|
93
95
|
isFineTuned: boolean;
|
94
96
|
contextWindowSize: number;
|
95
|
-
promptTokenCostInMillicents: number;
|
96
|
-
completionTokenCostInMillicents: number;
|
97
|
+
promptTokenCostInMillicents: number | null;
|
98
|
+
completionTokenCostInMillicents: number | null;
|
97
99
|
};
|
98
|
-
type FineTuneableOpenAIChatModelType = `gpt-3.5-turbo` | `gpt-3.5-turbo-0613`;
|
100
|
+
type FineTuneableOpenAIChatModelType = `gpt-3.5-turbo` | `gpt-3.5-turbo-0613` | `gpt-4-0613`;
|
99
101
|
type FineTunedOpenAIChatModelType = `ft:${FineTuneableOpenAIChatModelType}:${string}:${string}:${string}`;
|
100
102
|
export type OpenAIChatBaseModelType = keyof typeof OPENAI_CHAT_MODELS;
|
101
103
|
export type OpenAIChatModelType = OpenAIChatBaseModelType | FineTunedOpenAIChatModelType;
|
@@ -103,7 +105,7 @@ export declare const isOpenAIChatModel: (model: string) => model is OpenAIChatMo
|
|
103
105
|
export declare const calculateOpenAIChatCostInMillicents: ({ model, response, }: {
|
104
106
|
model: OpenAIChatModelType;
|
105
107
|
response: OpenAIChatResponse;
|
106
|
-
}) => number;
|
108
|
+
}) => number | null;
|
107
109
|
export interface OpenAIChatCallSettings {
|
108
110
|
api?: ApiConfiguration;
|
109
111
|
model: OpenAIChatModelType;
|
@@ -193,12 +195,12 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
193
195
|
arguments: string;
|
194
196
|
} | undefined;
|
195
197
|
};
|
196
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
197
198
|
index: number;
|
198
199
|
logprobs?: any;
|
200
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
199
201
|
}[];
|
200
202
|
created: number;
|
201
|
-
system_fingerprint
|
203
|
+
system_fingerprint?: string | undefined;
|
202
204
|
};
|
203
205
|
text: string;
|
204
206
|
usage: {
|
@@ -234,12 +236,12 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
234
236
|
arguments: string;
|
235
237
|
} | undefined;
|
236
238
|
};
|
237
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
238
239
|
index: number;
|
239
240
|
logprobs?: any;
|
241
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
240
242
|
}[];
|
241
243
|
created: number;
|
242
|
-
system_fingerprint
|
244
|
+
system_fingerprint?: string | undefined;
|
243
245
|
};
|
244
246
|
valueText: string;
|
245
247
|
value: any;
|
@@ -269,12 +271,12 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
269
271
|
arguments: string;
|
270
272
|
} | undefined;
|
271
273
|
};
|
272
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
273
274
|
index: number;
|
274
275
|
logprobs?: any;
|
276
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
275
277
|
}[];
|
276
278
|
created: number;
|
277
|
-
system_fingerprint
|
279
|
+
system_fingerprint?: string | undefined;
|
278
280
|
};
|
279
281
|
structureAndText: {
|
280
282
|
structure: null;
|
@@ -306,12 +308,12 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
306
308
|
arguments: string;
|
307
309
|
} | undefined;
|
308
310
|
};
|
309
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
310
311
|
index: number;
|
311
312
|
logprobs?: any;
|
313
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
312
314
|
}[];
|
313
315
|
created: number;
|
314
|
-
system_fingerprint
|
316
|
+
system_fingerprint?: string | undefined;
|
315
317
|
};
|
316
318
|
structureAndText: {
|
317
319
|
structure: string;
|
@@ -343,10 +345,6 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
343
345
|
}
|
344
346
|
declare const openAIChatResponseSchema: z.ZodObject<{
|
345
347
|
id: z.ZodString;
|
346
|
-
object: z.ZodLiteral<"chat.completion">;
|
347
|
-
created: z.ZodNumber;
|
348
|
-
model: z.ZodString;
|
349
|
-
system_fingerprint: z.ZodString;
|
350
348
|
choices: z.ZodArray<z.ZodObject<{
|
351
349
|
message: z.ZodObject<{
|
352
350
|
role: z.ZodLiteral<"assistant">;
|
@@ -378,7 +376,7 @@ declare const openAIChatResponseSchema: z.ZodObject<{
|
|
378
376
|
}>;
|
379
377
|
index: z.ZodNumber;
|
380
378
|
logprobs: z.ZodNullable<z.ZodAny>;
|
381
|
-
finish_reason: z.ZodEnum<["stop", "length", "tool_calls", "content_filter", "function_call"]
|
379
|
+
finish_reason: z.ZodNullable<z.ZodOptional<z.ZodEnum<["stop", "length", "tool_calls", "content_filter", "function_call"]>>>;
|
382
380
|
}, "strip", z.ZodTypeAny, {
|
383
381
|
message: {
|
384
382
|
content: string | null;
|
@@ -388,9 +386,9 @@ declare const openAIChatResponseSchema: z.ZodObject<{
|
|
388
386
|
arguments: string;
|
389
387
|
} | undefined;
|
390
388
|
};
|
391
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
392
389
|
index: number;
|
393
390
|
logprobs?: any;
|
391
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
394
392
|
}, {
|
395
393
|
message: {
|
396
394
|
content: string | null;
|
@@ -400,10 +398,14 @@ declare const openAIChatResponseSchema: z.ZodObject<{
|
|
400
398
|
arguments: string;
|
401
399
|
} | undefined;
|
402
400
|
};
|
403
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
404
401
|
index: number;
|
405
402
|
logprobs?: any;
|
403
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
406
404
|
}>, "many">;
|
405
|
+
created: z.ZodNumber;
|
406
|
+
model: z.ZodString;
|
407
|
+
system_fingerprint: z.ZodOptional<z.ZodString>;
|
408
|
+
object: z.ZodLiteral<"chat.completion">;
|
407
409
|
usage: z.ZodObject<{
|
408
410
|
prompt_tokens: z.ZodNumber;
|
409
411
|
completion_tokens: z.ZodNumber;
|
@@ -435,12 +437,12 @@ declare const openAIChatResponseSchema: z.ZodObject<{
|
|
435
437
|
arguments: string;
|
436
438
|
} | undefined;
|
437
439
|
};
|
438
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
439
440
|
index: number;
|
440
441
|
logprobs?: any;
|
442
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
441
443
|
}[];
|
442
444
|
created: number;
|
443
|
-
system_fingerprint
|
445
|
+
system_fingerprint?: string | undefined;
|
444
446
|
}, {
|
445
447
|
object: "chat.completion";
|
446
448
|
usage: {
|
@@ -459,12 +461,12 @@ declare const openAIChatResponseSchema: z.ZodObject<{
|
|
459
461
|
arguments: string;
|
460
462
|
} | undefined;
|
461
463
|
};
|
462
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
463
464
|
index: number;
|
464
465
|
logprobs?: any;
|
466
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
465
467
|
}[];
|
466
468
|
created: number;
|
467
|
-
system_fingerprint
|
469
|
+
system_fingerprint?: string | undefined;
|
468
470
|
}>;
|
469
471
|
export type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;
|
470
472
|
export type OpenAIChatResponseFormatType<T> = {
|
@@ -495,12 +497,12 @@ export declare const OpenAIChatResponseFormat: {
|
|
495
497
|
arguments: string;
|
496
498
|
} | undefined;
|
497
499
|
};
|
498
|
-
finish_reason: "length" | "stop" | "function_call" | "tool_calls" | "content_filter";
|
499
500
|
index: number;
|
500
501
|
logprobs?: any;
|
502
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
501
503
|
}[];
|
502
504
|
created: number;
|
503
|
-
system_fingerprint
|
505
|
+
system_fingerprint?: string | undefined;
|
504
506
|
}>;
|
505
507
|
};
|
506
508
|
/**
|
@@ -33,6 +33,8 @@ export const OPENAI_CHAT_MODELS = {
|
|
33
33
|
contextWindowSize: 8192,
|
34
34
|
promptTokenCostInMillicents: 3,
|
35
35
|
completionTokenCostInMillicents: 6,
|
36
|
+
fineTunedPromptTokenCostInMillicents: null,
|
37
|
+
fineTunedCompletionTokenCostInMillicents: null,
|
36
38
|
},
|
37
39
|
"gpt-4-1106-preview": {
|
38
40
|
contextWindowSize: 128000,
|
@@ -109,7 +111,7 @@ export function getOpenAIChatModelInformation(model) {
|
|
109
111
|
// Extract the base model from the fine-tuned model:
|
110
112
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
111
113
|
const [_, baseModel, ___, ____, _____] = model.split(":");
|
112
|
-
if (["gpt-3.5-turbo", "gpt-3.5-turbo-0613"].includes(baseModel)) {
|
114
|
+
if (["gpt-3.5-turbo", "gpt-3.5-turbo-0613", "gpt-4-0613"].includes(baseModel)) {
|
113
115
|
const baseModelInformation = OPENAI_CHAT_MODELS[baseModel];
|
114
116
|
return {
|
115
117
|
baseModel: baseModel,
|
@@ -125,11 +127,14 @@ export const isOpenAIChatModel = (model) => model in OPENAI_CHAT_MODELS ||
|
|
125
127
|
model.startsWith("ft:gpt-3.5-turbo-0613:") ||
|
126
128
|
model.startsWith("ft:gpt-3.5-turbo:");
|
127
129
|
export const calculateOpenAIChatCostInMillicents = ({ model, response, }) => {
|
128
|
-
const
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
const { promptTokenCostInMillicents, completionTokenCostInMillicents } = getOpenAIChatModelInformation(model);
|
131
|
+
// null: when cost is unknown, e.g. for fine-tuned models where the price is not yet known
|
132
|
+
if (promptTokenCostInMillicents == null ||
|
133
|
+
completionTokenCostInMillicents == null) {
|
134
|
+
return null;
|
135
|
+
}
|
136
|
+
return (response.usage.prompt_tokens * promptTokenCostInMillicents +
|
137
|
+
response.usage.completion_tokens * completionTokenCostInMillicents);
|
133
138
|
};
|
134
139
|
/**
|
135
140
|
* Create a text generation model that calls the OpenAI chat completion API.
|
@@ -225,6 +230,8 @@ export class OpenAIChatModel extends AbstractModel {
|
|
225
230
|
"presencePenalty",
|
226
231
|
"frequencyPenalty",
|
227
232
|
"logitBias",
|
233
|
+
"seed",
|
234
|
+
"responseFormat",
|
228
235
|
];
|
229
236
|
return Object.fromEntries(Object.entries(this.settings).filter(([key]) => eventSettingProperties.includes(key)));
|
230
237
|
}
|
@@ -378,10 +385,6 @@ export class OpenAIChatModel extends AbstractModel {
|
|
378
385
|
}
|
379
386
|
const openAIChatResponseSchema = z.object({
|
380
387
|
id: z.string(),
|
381
|
-
object: z.literal("chat.completion"),
|
382
|
-
created: z.number(),
|
383
|
-
model: z.string(),
|
384
|
-
system_fingerprint: z.string(),
|
385
388
|
choices: z.array(z.object({
|
386
389
|
message: z.object({
|
387
390
|
role: z.literal("assistant"),
|
@@ -395,14 +398,21 @@ const openAIChatResponseSchema = z.object({
|
|
395
398
|
}),
|
396
399
|
index: z.number(),
|
397
400
|
logprobs: z.nullable(z.any()),
|
398
|
-
finish_reason: z
|
401
|
+
finish_reason: z
|
402
|
+
.enum([
|
399
403
|
"stop",
|
400
404
|
"length",
|
401
405
|
"tool_calls",
|
402
406
|
"content_filter",
|
403
407
|
"function_call",
|
404
|
-
])
|
408
|
+
])
|
409
|
+
.optional()
|
410
|
+
.nullable(),
|
405
411
|
})),
|
412
|
+
created: z.number(),
|
413
|
+
model: z.string(),
|
414
|
+
system_fingerprint: z.string().optional(),
|
415
|
+
object: z.literal("chat.completion"),
|
406
416
|
usage: z.object({
|
407
417
|
prompt_tokens: z.number(),
|
408
418
|
completion_tokens: z.number(),
|
@@ -6,6 +6,7 @@ const AsyncQueue_js_1 = require("../../../util/AsyncQueue.cjs");
|
|
6
6
|
const parseEventSourceStream_js_1 = require("../../../util/streaming/parseEventSourceStream.cjs");
|
7
7
|
const parseJSON_js_1 = require("../../../util/parseJSON.cjs");
|
8
8
|
const chatResponseStreamEventSchema = zod_1.z.object({
|
9
|
+
id: zod_1.z.string(),
|
9
10
|
choices: zod_1.z.array(zod_1.z.object({
|
10
11
|
delta: zod_1.z.object({
|
11
12
|
role: zod_1.z.enum(["assistant", "user"]).optional(),
|
@@ -30,9 +31,9 @@ const chatResponseStreamEventSchema = zod_1.z.object({
|
|
30
31
|
index: zod_1.z.number(),
|
31
32
|
})),
|
32
33
|
created: zod_1.z.number(),
|
33
|
-
id: zod_1.z.string(),
|
34
34
|
model: zod_1.z.string(),
|
35
|
-
|
35
|
+
system_fingerprint: zod_1.z.string().optional(),
|
36
|
+
object: zod_1.z.literal("chat.completion.chunk"),
|
36
37
|
});
|
37
38
|
async function createOpenAIChatDeltaIterableQueue(stream, extractDeltaValue) {
|
38
39
|
const queue = new AsyncQueue_js_1.AsyncQueue();
|
@@ -3,6 +3,7 @@ import { AsyncQueue } from "../../../util/AsyncQueue.js";
|
|
3
3
|
import { parseEventSourceStream } from "../../../util/streaming/parseEventSourceStream.js";
|
4
4
|
import { safeParseJsonWithZod } from "../../../util/parseJSON.js";
|
5
5
|
const chatResponseStreamEventSchema = z.object({
|
6
|
+
id: z.string(),
|
6
7
|
choices: z.array(z.object({
|
7
8
|
delta: z.object({
|
8
9
|
role: z.enum(["assistant", "user"]).optional(),
|
@@ -27,9 +28,9 @@ const chatResponseStreamEventSchema = z.object({
|
|
27
28
|
index: z.number(),
|
28
29
|
})),
|
29
30
|
created: z.number(),
|
30
|
-
id: z.string(),
|
31
31
|
model: z.string(),
|
32
|
-
|
32
|
+
system_fingerprint: z.string().optional(),
|
33
|
+
object: z.literal("chat.completion.chunk"),
|
33
34
|
});
|
34
35
|
export async function createOpenAIChatDeltaIterableQueue(stream, extractDeltaValue) {
|
35
36
|
const queue = new AsyncQueue();
|
package/package.json
CHANGED