modelfusion 0.30.0 → 0.31.0
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/README.md +7 -11
- package/model-function/SuccessfulModelCall.cjs +2 -9
- package/model-function/SuccessfulModelCall.d.ts +10 -7
- package/model-function/SuccessfulModelCall.js +2 -9
- package/model-function/embed-text/embedText.cjs +4 -2
- package/model-function/embed-text/embedText.d.ts +1 -1
- package/model-function/embed-text/embedText.js +4 -2
- package/model-function/generate-structure/StructureFromTextGenerationModel.cjs +2 -2
- package/model-function/generate-structure/StructureFromTextGenerationModel.d.ts +5 -9
- package/model-function/generate-structure/StructureFromTextGenerationModel.js +2 -2
- package/model-function/generate-structure/StructureGenerationModel.d.ts +3 -2
- package/model-function/generate-structure/StructureOrTextGenerationModel.d.ts +4 -5
- package/model-function/generate-structure/generateStructure.cjs +5 -2
- package/model-function/generate-structure/generateStructure.d.ts +1 -1
- package/model-function/generate-structure/generateStructure.js +5 -2
- package/model-function/generate-structure/generateStructureOrText.cjs +8 -5
- package/model-function/generate-structure/generateStructureOrText.d.ts +2 -2
- package/model-function/generate-structure/generateStructureOrText.js +8 -5
- package/model-function/index.cjs +2 -3
- package/model-function/index.d.ts +2 -3
- package/model-function/index.js +2 -3
- package/model-provider/openai/OpenAICostCalculator.cjs +6 -5
- package/model-provider/openai/OpenAICostCalculator.js +6 -5
- package/model-provider/openai/OpenAITextEmbeddingModel.cjs +1 -1
- package/model-provider/openai/OpenAITextEmbeddingModel.js +1 -1
- package/model-provider/openai/chat/OpenAIChatModel.cjs +47 -9
- package/model-provider/openai/chat/OpenAIChatModel.d.ts +15 -5
- package/model-provider/openai/chat/OpenAIChatModel.js +47 -9
- package/model-provider/openai/chat/OpenAIChatPromptFormat.cjs +78 -0
- package/model-provider/openai/chat/OpenAIChatPromptFormat.d.ts +12 -0
- package/model-provider/openai/chat/OpenAIChatPromptFormat.js +73 -0
- package/model-provider/openai/index.cjs +2 -3
- package/model-provider/openai/index.d.ts +1 -1
- package/model-provider/openai/index.js +1 -1
- package/package.json +1 -1
- package/prompt/AlpacaPromptFormat.cjs +23 -21
- package/prompt/AlpacaPromptFormat.d.ts +1 -1
- package/prompt/AlpacaPromptFormat.js +21 -19
- package/prompt/InstructionPrompt.d.ts +9 -0
- package/prompt/Llama2PromptFormat.cjs +44 -40
- package/prompt/Llama2PromptFormat.d.ts +2 -2
- package/prompt/Llama2PromptFormat.js +41 -37
- package/prompt/TextPromptFormat.cjs +5 -5
- package/prompt/TextPromptFormat.d.ts +2 -2
- package/prompt/TextPromptFormat.js +2 -2
- package/prompt/VicunaPromptFormat.cjs +39 -37
- package/prompt/VicunaPromptFormat.d.ts +1 -1
- package/prompt/VicunaPromptFormat.js +37 -35
- package/prompt/index.cjs +0 -1
- package/prompt/index.d.ts +0 -1
- package/prompt/index.js +0 -1
- package/tool/useTool.cjs +5 -1
- package/tool/useTool.d.ts +1 -1
- package/tool/useTool.js +5 -1
- package/tool/useToolOrGenerateText.cjs +5 -2
- package/tool/useToolOrGenerateText.d.ts +2 -2
- package/tool/useToolOrGenerateText.js +5 -2
- package/model-function/generate-structure/InstructionWithStructurePrompt.cjs +0 -17
- package/model-function/generate-structure/InstructionWithStructurePrompt.d.ts +0 -17
- package/model-function/generate-structure/InstructionWithStructurePrompt.js +0 -14
- package/model-provider/openai/chat/OpenAIChatPrompt.cjs +0 -135
- package/model-provider/openai/chat/OpenAIChatPrompt.d.ts +0 -96
- package/model-provider/openai/chat/OpenAIChatPrompt.js +0 -127
- package/prompt/OpenAIChatPromptFormat.cjs +0 -74
- package/prompt/OpenAIChatPromptFormat.d.ts +0 -12
- package/prompt/OpenAIChatPromptFormat.js +0 -69
package/README.md
CHANGED
@@ -82,7 +82,7 @@ const text = await generateText(
|
|
82
82
|
new LlamaCppTextGenerationModel({
|
83
83
|
contextWindowSize: 4096, // Llama 2 context window size
|
84
84
|
maxCompletionTokens: 1000,
|
85
|
-
}).withPromptFormat(
|
85
|
+
}).withPromptFormat(mapInstructionPromptToLlama2Format()),
|
86
86
|
{
|
87
87
|
system: "You are a story writer.",
|
88
88
|
instruction: "Write a short story about a robot learning to love.",
|
@@ -94,7 +94,7 @@ const text = await generateText(
|
|
94
94
|
const textStream = await streamText(
|
95
95
|
new OpenAIChatModel({
|
96
96
|
model: "gpt-3.5-turbo",
|
97
|
-
}).withPromptFormat(
|
97
|
+
}).withPromptFormat(mapChatPromptToOpenAIChatFormat()),
|
98
98
|
[
|
99
99
|
{ system: "You are a celebrated poet." },
|
100
100
|
{ user: "Write a short story about a robot learning to love." },
|
@@ -155,7 +155,7 @@ const sentiment = await generateStructure(
|
|
155
155
|
.describe("Sentiment."),
|
156
156
|
}),
|
157
157
|
}),
|
158
|
-
|
158
|
+
[
|
159
159
|
OpenAIChatMessage.system(
|
160
160
|
"You are a sentiment evaluator. " +
|
161
161
|
"Analyze the sentiment of the following product review:"
|
@@ -164,7 +164,7 @@ const sentiment = await generateStructure(
|
|
164
164
|
"After I opened the package, I was met by a very unpleasant smell " +
|
165
165
|
"that did not disappear even after washing. Never again!"
|
166
166
|
),
|
167
|
-
]
|
167
|
+
]
|
168
168
|
);
|
169
169
|
```
|
170
170
|
|
@@ -197,7 +197,7 @@ const { structure, value, text } = await generateStructureOrText(
|
|
197
197
|
}),
|
198
198
|
}),
|
199
199
|
],
|
200
|
-
|
200
|
+
[OpenAIChatMessage.user(query)]
|
201
201
|
);
|
202
202
|
```
|
203
203
|
|
@@ -253,9 +253,7 @@ The model determines the parameters for the tool from the prompt and then execut
|
|
253
253
|
const { tool, parameters, result } = await useTool(
|
254
254
|
new OpenAIChatModel({ model: "gpt-3.5-turbo" }),
|
255
255
|
calculator,
|
256
|
-
|
257
|
-
OpenAIChatMessage.user("What's fourteen times twelve?"),
|
258
|
-
])
|
256
|
+
[OpenAIChatMessage.user("What's fourteen times twelve?")]
|
259
257
|
);
|
260
258
|
```
|
261
259
|
|
@@ -268,9 +266,7 @@ Text is generated as a fallback.
|
|
268
266
|
const { tool, parameters, result, text } = await useToolOrGenerateText(
|
269
267
|
new OpenAIChatModel({ model: "gpt-3.5-turbo" }),
|
270
268
|
[calculator /* and other tools... */],
|
271
|
-
|
272
|
-
OpenAIChatMessage.user("What's fourteen times twelve?"),
|
273
|
-
])
|
269
|
+
[OpenAIChatMessage.user("What's fourteen times twelve?")]
|
274
270
|
);
|
275
271
|
```
|
276
272
|
|
@@ -2,15 +2,8 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.extractSuccessfulModelCalls = void 0;
|
4
4
|
function extractSuccessfulModelCalls(runFunctionEvents) {
|
5
|
-
return runFunctionEvents
|
6
|
-
.filter((event) => "result" in event &&
|
5
|
+
return runFunctionEvents.filter((event) => "result" in event &&
|
7
6
|
"status" in event.result &&
|
8
|
-
event.result.status === "success")
|
9
|
-
.map((event) => ({
|
10
|
-
model: event.model,
|
11
|
-
settings: event.settings,
|
12
|
-
response: event.result.response,
|
13
|
-
type: event.functionType,
|
14
|
-
}));
|
7
|
+
event.result.status === "success");
|
15
8
|
}
|
16
9
|
exports.extractSuccessfulModelCalls = extractSuccessfulModelCalls;
|
@@ -1,9 +1,12 @@
|
|
1
1
|
import { FunctionEvent } from "../core/FunctionEvent.js";
|
2
|
-
import {
|
3
|
-
export type SuccessfulModelCall = {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
response: unknown;
|
2
|
+
import { ModelCallFinishedEvent } from "./ModelCallEvent.js";
|
3
|
+
export type SuccessfulModelCall = ModelCallFinishedEvent & {
|
4
|
+
result: {
|
5
|
+
status: "success";
|
6
|
+
};
|
8
7
|
};
|
9
|
-
export declare function extractSuccessfulModelCalls(runFunctionEvents: FunctionEvent[]):
|
8
|
+
export declare function extractSuccessfulModelCalls(runFunctionEvents: FunctionEvent[]): (ModelCallFinishedEvent & {
|
9
|
+
result: {
|
10
|
+
status: "success";
|
11
|
+
};
|
12
|
+
})[];
|
@@ -1,12 +1,5 @@
|
|
1
1
|
export function extractSuccessfulModelCalls(runFunctionEvents) {
|
2
|
-
return runFunctionEvents
|
3
|
-
.filter((event) => "result" in event &&
|
2
|
+
return runFunctionEvents.filter((event) => "result" in event &&
|
4
3
|
"status" in event.result &&
|
5
|
-
event.result.status === "success")
|
6
|
-
.map((event) => ({
|
7
|
-
model: event.model,
|
8
|
-
settings: event.settings,
|
9
|
-
response: event.result.response,
|
10
|
-
type: event.functionType,
|
11
|
-
}));
|
4
|
+
event.result.status === "success");
|
12
5
|
}
|
@@ -59,8 +59,10 @@ function embedText(model, text, options) {
|
|
59
59
|
input: text,
|
60
60
|
model,
|
61
61
|
options,
|
62
|
-
generateResponse: (options) =>
|
63
|
-
|
62
|
+
generateResponse: async (options) => [
|
63
|
+
await model.generateEmbeddingResponse([text], options),
|
64
|
+
],
|
65
|
+
extractOutputValue: (result) => model.extractEmbeddings(result[0])[0],
|
64
66
|
});
|
65
67
|
}
|
66
68
|
exports.embedText = embedText;
|
@@ -24,4 +24,4 @@ export declare function embedTexts<RESPONSE, SETTINGS extends TextEmbeddingModel
|
|
24
24
|
* "At first, Nox didn't know what to do with the pup."
|
25
25
|
* );
|
26
26
|
*/
|
27
|
-
export declare function embedText<RESPONSE, SETTINGS extends TextEmbeddingModelSettings>(model: TextEmbeddingModel<RESPONSE, SETTINGS>, text: string, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector, RESPONSE>;
|
27
|
+
export declare function embedText<RESPONSE, SETTINGS extends TextEmbeddingModelSettings>(model: TextEmbeddingModel<RESPONSE, SETTINGS>, text: string, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector, RESPONSE[]>;
|
@@ -55,7 +55,9 @@ export function embedText(model, text, options) {
|
|
55
55
|
input: text,
|
56
56
|
model,
|
57
57
|
options,
|
58
|
-
generateResponse: (options) =>
|
59
|
-
|
58
|
+
generateResponse: async (options) => [
|
59
|
+
await model.generateEmbeddingResponse([text], options),
|
60
|
+
],
|
61
|
+
extractOutputValue: (result) => model.extractEmbeddings(result[0])[0],
|
60
62
|
});
|
61
63
|
}
|
@@ -28,8 +28,8 @@ class StructureFromTextGenerationModel {
|
|
28
28
|
get settingsForEvent() {
|
29
29
|
return this.model.settingsForEvent;
|
30
30
|
}
|
31
|
-
async generateStructureResponse(prompt, options) {
|
32
|
-
return await (0, generateText_js_1.generateText)(this.model, this.format.createPrompt(prompt), options);
|
31
|
+
async generateStructureResponse(structure, prompt, options) {
|
32
|
+
return await (0, generateText_js_1.generateText)(this.model, this.format.createPrompt(prompt, structure), options);
|
33
33
|
}
|
34
34
|
extractStructure(response) {
|
35
35
|
return this.format.extractStructure(response);
|
@@ -1,26 +1,22 @@
|
|
1
1
|
import { TextGenerationModel, TextGenerationModelSettings } from "../generate-text/TextGenerationModel.js";
|
2
2
|
import { StructureDefinition } from "../../core/structure/StructureDefinition.js";
|
3
|
-
import { InstructionWithStructure } from "./InstructionWithStructurePrompt.js";
|
4
3
|
import { StructureGenerationModel } from "./StructureGenerationModel.js";
|
5
4
|
import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
|
6
|
-
export type StructureFromTextPromptFormat = {
|
7
|
-
createPrompt: (prompt:
|
8
|
-
instruction: string;
|
9
|
-
structure: StructureDefinition<string, unknown>;
|
10
|
-
}) => string;
|
5
|
+
export type StructureFromTextPromptFormat<PROMPT> = {
|
6
|
+
createPrompt: (prompt: PROMPT, structure: StructureDefinition<string, unknown>) => string;
|
11
7
|
extractStructure: (response: string) => unknown;
|
12
8
|
};
|
13
|
-
export declare class StructureFromTextGenerationModel<MODEL extends TextGenerationModel<string, any, any, TextGenerationModelSettings>> implements StructureGenerationModel<
|
9
|
+
export declare class StructureFromTextGenerationModel<PROMPT, MODEL extends TextGenerationModel<string, any, any, TextGenerationModelSettings>> implements StructureGenerationModel<PROMPT, string, MODEL["settings"]> {
|
14
10
|
private readonly model;
|
15
11
|
private readonly format;
|
16
12
|
constructor({ model, format, }: {
|
17
13
|
model: MODEL;
|
18
|
-
format: StructureFromTextPromptFormat
|
14
|
+
format: StructureFromTextPromptFormat<PROMPT>;
|
19
15
|
});
|
20
16
|
get modelInformation(): import("../ModelInformation.js").ModelInformation;
|
21
17
|
get settings(): TextGenerationModelSettings;
|
22
18
|
get settingsForEvent(): Partial<MODEL["settings"]>;
|
23
|
-
generateStructureResponse(
|
19
|
+
generateStructureResponse(structure: StructureDefinition<string, unknown>, prompt: PROMPT, options?: ModelFunctionOptions<MODEL["settings"]> | undefined): Promise<string>;
|
24
20
|
extractStructure(response: string): unknown;
|
25
21
|
withSettings(additionalSettings: Partial<MODEL["settings"]>): this;
|
26
22
|
}
|
@@ -25,8 +25,8 @@ export class StructureFromTextGenerationModel {
|
|
25
25
|
get settingsForEvent() {
|
26
26
|
return this.model.settingsForEvent;
|
27
27
|
}
|
28
|
-
async generateStructureResponse(prompt, options) {
|
29
|
-
return await generateText(this.model, this.format.createPrompt(prompt), options);
|
28
|
+
async generateStructureResponse(structure, prompt, options) {
|
29
|
+
return await generateText(this.model, this.format.createPrompt(prompt, structure), options);
|
30
30
|
}
|
31
31
|
extractStructure(response) {
|
32
32
|
return this.format.extractStructure(response);
|
@@ -1,9 +1,10 @@
|
|
1
|
-
import {
|
1
|
+
import { StructureDefinition } from "../../core/structure/StructureDefinition.js";
|
2
2
|
import { Model, ModelSettings } from "../Model.js";
|
3
|
+
import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
|
3
4
|
export interface StructureGenerationModelSettings extends ModelSettings {
|
4
5
|
}
|
5
6
|
export interface StructureGenerationModel<PROMPT, RESPONSE, SETTINGS extends StructureGenerationModelSettings> extends Model<SETTINGS> {
|
6
|
-
generateStructureResponse(prompt: PROMPT, options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
|
7
|
+
generateStructureResponse(structure: StructureDefinition<string, unknown>, prompt: PROMPT, options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
|
7
8
|
extractStructure(response: RESPONSE): unknown;
|
8
9
|
extractUsage?(response: RESPONSE): {
|
9
10
|
promptTokens: number;
|
@@ -1,8 +1,10 @@
|
|
1
|
-
import {
|
1
|
+
import { StructureDefinition } from "../../core/structure/StructureDefinition.js";
|
2
2
|
import { Model, ModelSettings } from "../Model.js";
|
3
|
+
import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
|
3
4
|
export interface StructureOrTextGenerationModelSettings extends ModelSettings {
|
4
5
|
}
|
5
|
-
export interface
|
6
|
+
export interface StructureOrTextGenerationModel<PROMPT, RESPONSE, SETTINGS extends StructureOrTextGenerationModelSettings> extends Model<SETTINGS> {
|
7
|
+
generateStructureOrTextResponse(structureDefinitions: Array<StructureDefinition<string, unknown>>, prompt: PROMPT, options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
|
6
8
|
extractStructureAndText(response: RESPONSE): {
|
7
9
|
structure: null;
|
8
10
|
value: null;
|
@@ -12,9 +14,6 @@ export interface StructureOrTextGenerationPrompt<RESPONSE> {
|
|
12
14
|
value: unknown;
|
13
15
|
text: string | null;
|
14
16
|
};
|
15
|
-
}
|
16
|
-
export interface StructureOrTextGenerationModel<PROMPT, RESPONSE, SETTINGS extends StructureOrTextGenerationModelSettings> extends Model<SETTINGS> {
|
17
|
-
generateStructureResponse(prompt: PROMPT & StructureOrTextGenerationPrompt<RESPONSE>, options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
|
18
17
|
extractUsage?(response: RESPONSE): {
|
19
18
|
promptTokens: number;
|
20
19
|
completionTokens: number;
|
@@ -4,13 +4,16 @@ exports.generateStructure = void 0;
|
|
4
4
|
const executeCall_js_1 = require("../executeCall.cjs");
|
5
5
|
const StructureValidationError_js_1 = require("./StructureValidationError.cjs");
|
6
6
|
function generateStructure(model, structureDefinition, prompt, options) {
|
7
|
-
|
7
|
+
// Note: PROMPT must not be a function.
|
8
|
+
const expandedPrompt = typeof prompt === "function"
|
9
|
+
? prompt(structureDefinition)
|
10
|
+
: prompt;
|
8
11
|
return (0, executeCall_js_1.executeCall)({
|
9
12
|
functionType: "structure-generation",
|
10
13
|
input: expandedPrompt,
|
11
14
|
model,
|
12
15
|
options,
|
13
|
-
generateResponse: (options) => model.generateStructureResponse(expandedPrompt, options),
|
16
|
+
generateResponse: (options) => model.generateStructureResponse(structureDefinition, expandedPrompt, options),
|
14
17
|
extractOutputValue: (response) => {
|
15
18
|
const structure = model.extractStructure(response);
|
16
19
|
const parseResult = structureDefinition.schema.validate(structure);
|
@@ -2,4 +2,4 @@ import { StructureDefinition } from "../../core/structure/StructureDefinition.js
|
|
2
2
|
import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
|
3
3
|
import { ModelFunctionPromise } from "../executeCall.js";
|
4
4
|
import { StructureGenerationModel, StructureGenerationModelSettings } from "./StructureGenerationModel.js";
|
5
|
-
export declare function generateStructure<STRUCTURE, PROMPT, RESPONSE, NAME extends string, SETTINGS extends StructureGenerationModelSettings>(model: StructureGenerationModel<PROMPT, RESPONSE, SETTINGS>, structureDefinition: StructureDefinition<NAME, STRUCTURE>, prompt: (structureDefinition: StructureDefinition<NAME, STRUCTURE>) => PROMPT, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<STRUCTURE, RESPONSE>;
|
5
|
+
export declare function generateStructure<STRUCTURE, PROMPT, RESPONSE, NAME extends string, SETTINGS extends StructureGenerationModelSettings>(model: StructureGenerationModel<PROMPT, RESPONSE, SETTINGS>, structureDefinition: StructureDefinition<NAME, STRUCTURE>, prompt: PROMPT | ((structureDefinition: StructureDefinition<NAME, STRUCTURE>) => PROMPT), options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<STRUCTURE, RESPONSE>;
|
@@ -1,13 +1,16 @@
|
|
1
1
|
import { executeCall } from "../executeCall.js";
|
2
2
|
import { StructureValidationError } from "./StructureValidationError.js";
|
3
3
|
export function generateStructure(model, structureDefinition, prompt, options) {
|
4
|
-
|
4
|
+
// Note: PROMPT must not be a function.
|
5
|
+
const expandedPrompt = typeof prompt === "function"
|
6
|
+
? prompt(structureDefinition)
|
7
|
+
: prompt;
|
5
8
|
return executeCall({
|
6
9
|
functionType: "structure-generation",
|
7
10
|
input: expandedPrompt,
|
8
11
|
model,
|
9
12
|
options,
|
10
|
-
generateResponse: (options) => model.generateStructureResponse(expandedPrompt, options),
|
13
|
+
generateResponse: (options) => model.generateStructureResponse(structureDefinition, expandedPrompt, options),
|
11
14
|
extractOutputValue: (response) => {
|
12
15
|
const structure = model.extractStructure(response);
|
13
16
|
const parseResult = structureDefinition.schema.validate(structure);
|
@@ -4,21 +4,24 @@ exports.generateStructureOrText = void 0;
|
|
4
4
|
const executeCall_js_1 = require("../executeCall.cjs");
|
5
5
|
const NoSuchStructureError_js_1 = require("./NoSuchStructureError.cjs");
|
6
6
|
const StructureValidationError_js_1 = require("./StructureValidationError.cjs");
|
7
|
-
function generateStructureOrText(model,
|
8
|
-
|
7
|
+
function generateStructureOrText(model, structureDefinitions, prompt, options) {
|
8
|
+
// Note: PROMPT must not be a function.
|
9
|
+
const expandedPrompt = typeof prompt === "function"
|
10
|
+
? prompt(structureDefinitions)
|
11
|
+
: prompt;
|
9
12
|
return (0, executeCall_js_1.executeCall)({
|
10
13
|
functionType: "structure-or-text-generation",
|
11
14
|
input: expandedPrompt,
|
12
15
|
model,
|
13
16
|
options,
|
14
|
-
generateResponse: (options) => model.
|
17
|
+
generateResponse: (options) => model.generateStructureOrTextResponse(structureDefinitions, expandedPrompt, options),
|
15
18
|
extractOutputValue: (response) => {
|
16
|
-
const { structure, value, text } =
|
19
|
+
const { structure, value, text } = model.extractStructureAndText(response);
|
17
20
|
// text generation:
|
18
21
|
if (structure == null) {
|
19
22
|
return { structure, value, text };
|
20
23
|
}
|
21
|
-
const definition =
|
24
|
+
const definition = structureDefinitions.find((d) => d.name === structure);
|
22
25
|
if (definition == undefined) {
|
23
26
|
throw new NoSuchStructureError_js_1.NoSuchStructureError(structure);
|
24
27
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
|
2
2
|
import { ModelFunctionPromise } from "../executeCall.js";
|
3
|
-
import { StructureOrTextGenerationModel, StructureOrTextGenerationModelSettings
|
3
|
+
import { StructureOrTextGenerationModel, StructureOrTextGenerationModelSettings } from "./StructureOrTextGenerationModel.js";
|
4
4
|
import { StructureDefinition } from "../../core/structure/StructureDefinition.js";
|
5
5
|
type StructureDefinitionArray<T extends StructureDefinition<any, any>[]> = T;
|
6
6
|
type ToStructureDefinitionMap<T extends StructureDefinitionArray<StructureDefinition<any, any>[]>> = {
|
@@ -14,7 +14,7 @@ type ToStructureUnion<T> = {
|
|
14
14
|
} : never;
|
15
15
|
}[keyof T];
|
16
16
|
type ToOutputValue<STRUCTURES extends StructureDefinitionArray<StructureDefinition<any, any>[]>> = ToStructureUnion<ToStructureDefinitionMap<STRUCTURES>>;
|
17
|
-
export declare function generateStructureOrText<STRUCTURES extends StructureDefinition<any, any>[], PROMPT, RESPONSE, SETTINGS extends StructureOrTextGenerationModelSettings>(model: StructureOrTextGenerationModel<PROMPT, RESPONSE, SETTINGS>,
|
17
|
+
export declare function generateStructureOrText<STRUCTURES extends StructureDefinition<any, any>[], PROMPT, RESPONSE, SETTINGS extends StructureOrTextGenerationModelSettings>(model: StructureOrTextGenerationModel<PROMPT, RESPONSE, SETTINGS>, structureDefinitions: STRUCTURES, prompt: PROMPT | ((structureDefinitions: STRUCTURES) => PROMPT), options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<{
|
18
18
|
structure: null;
|
19
19
|
value: null;
|
20
20
|
text: string;
|
@@ -1,21 +1,24 @@
|
|
1
1
|
import { executeCall } from "../executeCall.js";
|
2
2
|
import { NoSuchStructureError } from "./NoSuchStructureError.js";
|
3
3
|
import { StructureValidationError } from "./StructureValidationError.js";
|
4
|
-
export function generateStructureOrText(model,
|
5
|
-
|
4
|
+
export function generateStructureOrText(model, structureDefinitions, prompt, options) {
|
5
|
+
// Note: PROMPT must not be a function.
|
6
|
+
const expandedPrompt = typeof prompt === "function"
|
7
|
+
? prompt(structureDefinitions)
|
8
|
+
: prompt;
|
6
9
|
return executeCall({
|
7
10
|
functionType: "structure-or-text-generation",
|
8
11
|
input: expandedPrompt,
|
9
12
|
model,
|
10
13
|
options,
|
11
|
-
generateResponse: (options) => model.
|
14
|
+
generateResponse: (options) => model.generateStructureOrTextResponse(structureDefinitions, expandedPrompt, options),
|
12
15
|
extractOutputValue: (response) => {
|
13
|
-
const { structure, value, text } =
|
16
|
+
const { structure, value, text } = model.extractStructureAndText(response);
|
14
17
|
// text generation:
|
15
18
|
if (structure == null) {
|
16
19
|
return { structure, value, text };
|
17
20
|
}
|
18
|
-
const definition =
|
21
|
+
const definition = structureDefinitions.find((d) => d.name === structure);
|
19
22
|
if (definition == undefined) {
|
20
23
|
throw new NoSuchStructureError(structure);
|
21
24
|
}
|
package/model-function/index.cjs
CHANGED
@@ -28,12 +28,11 @@ __exportStar(require("./embed-text/embedText.cjs"), exports);
|
|
28
28
|
__exportStar(require("./generate-image/ImageGenerationEvent.cjs"), exports);
|
29
29
|
__exportStar(require("./generate-image/ImageGenerationModel.cjs"), exports);
|
30
30
|
__exportStar(require("./generate-image/generateImage.cjs"), exports);
|
31
|
-
__exportStar(require("./generate-structure/
|
31
|
+
__exportStar(require("./generate-structure/NoSuchStructureError.cjs"), exports);
|
32
|
+
__exportStar(require("./generate-structure/StructureFromTextGenerationModel.cjs"), exports);
|
32
33
|
__exportStar(require("./generate-structure/StructureGenerationEvent.cjs"), exports);
|
33
34
|
__exportStar(require("./generate-structure/StructureGenerationModel.cjs"), exports);
|
34
35
|
__exportStar(require("./generate-structure/StructureOrTextGenerationModel.cjs"), exports);
|
35
|
-
__exportStar(require("./generate-structure/StructureFromTextGenerationModel.cjs"), exports);
|
36
|
-
__exportStar(require("./generate-structure/NoSuchStructureError.cjs"), exports);
|
37
36
|
__exportStar(require("./generate-structure/StructureValidationError.cjs"), exports);
|
38
37
|
__exportStar(require("./generate-structure/generateStructure.cjs"), exports);
|
39
38
|
__exportStar(require("./generate-structure/generateStructureOrText.cjs"), exports);
|
@@ -12,12 +12,11 @@ export * from "./embed-text/embedText.js";
|
|
12
12
|
export * from "./generate-image/ImageGenerationEvent.js";
|
13
13
|
export * from "./generate-image/ImageGenerationModel.js";
|
14
14
|
export * from "./generate-image/generateImage.js";
|
15
|
-
export * from "./generate-structure/
|
15
|
+
export * from "./generate-structure/NoSuchStructureError.js";
|
16
|
+
export * from "./generate-structure/StructureFromTextGenerationModel.js";
|
16
17
|
export * from "./generate-structure/StructureGenerationEvent.js";
|
17
18
|
export * from "./generate-structure/StructureGenerationModel.js";
|
18
19
|
export * from "./generate-structure/StructureOrTextGenerationModel.js";
|
19
|
-
export * from "./generate-structure/StructureFromTextGenerationModel.js";
|
20
|
-
export * from "./generate-structure/NoSuchStructureError.js";
|
21
20
|
export * from "./generate-structure/StructureValidationError.js";
|
22
21
|
export * from "./generate-structure/generateStructure.js";
|
23
22
|
export * from "./generate-structure/generateStructureOrText.js";
|
package/model-function/index.js
CHANGED
@@ -12,12 +12,11 @@ export * from "./embed-text/embedText.js";
|
|
12
12
|
export * from "./generate-image/ImageGenerationEvent.js";
|
13
13
|
export * from "./generate-image/ImageGenerationModel.js";
|
14
14
|
export * from "./generate-image/generateImage.js";
|
15
|
-
export * from "./generate-structure/
|
15
|
+
export * from "./generate-structure/NoSuchStructureError.js";
|
16
|
+
export * from "./generate-structure/StructureFromTextGenerationModel.js";
|
16
17
|
export * from "./generate-structure/StructureGenerationEvent.js";
|
17
18
|
export * from "./generate-structure/StructureGenerationModel.js";
|
18
19
|
export * from "./generate-structure/StructureOrTextGenerationModel.js";
|
19
|
-
export * from "./generate-structure/StructureFromTextGenerationModel.js";
|
20
|
-
export * from "./generate-structure/NoSuchStructureError.js";
|
21
20
|
export * from "./generate-structure/StructureValidationError.js";
|
22
21
|
export * from "./generate-structure/generateStructure.js";
|
23
22
|
export * from "./generate-structure/generateStructureOrText.js";
|
@@ -16,7 +16,7 @@ class OpenAICostCalculator {
|
|
16
16
|
});
|
17
17
|
}
|
18
18
|
async calculateCostInMillicents(call) {
|
19
|
-
const type = call.
|
19
|
+
const type = call.functionType;
|
20
20
|
const model = call.model.modelName;
|
21
21
|
switch (type) {
|
22
22
|
case "image-generation": {
|
@@ -31,7 +31,7 @@ class OpenAICostCalculator {
|
|
31
31
|
if ((0, OpenAITextEmbeddingModel_js_1.isOpenAIEmbeddingModel)(model)) {
|
32
32
|
return (0, OpenAITextEmbeddingModel_js_1.calculateOpenAIEmbeddingCostInMillicents)({
|
33
33
|
model,
|
34
|
-
responses: call.response,
|
34
|
+
responses: call.result.response,
|
35
35
|
});
|
36
36
|
}
|
37
37
|
break;
|
@@ -44,13 +44,13 @@ class OpenAICostCalculator {
|
|
44
44
|
if ((0, OpenAIChatModel_js_1.isOpenAIChatModel)(model)) {
|
45
45
|
return (0, OpenAIChatModel_js_1.calculateOpenAIChatCostInMillicents)({
|
46
46
|
model,
|
47
|
-
response: call.response,
|
47
|
+
response: call.result.response,
|
48
48
|
});
|
49
49
|
}
|
50
50
|
if ((0, OpenAITextGenerationModel_js_1.isOpenAITextGenerationModel)(model)) {
|
51
51
|
return (0, OpenAITextGenerationModel_js_1.calculateOpenAITextGenerationCostInMillicents)({
|
52
52
|
model,
|
53
|
-
response: call.response,
|
53
|
+
response: call.result.response,
|
54
54
|
});
|
55
55
|
}
|
56
56
|
break;
|
@@ -61,7 +61,8 @@ class OpenAICostCalculator {
|
|
61
61
|
}
|
62
62
|
return (0, OpenAITranscriptionModel_js_1.calculateOpenAITranscriptionCostInMillicents)({
|
63
63
|
model: model,
|
64
|
-
response: call.
|
64
|
+
response: call.result
|
65
|
+
.response,
|
65
66
|
});
|
66
67
|
}
|
67
68
|
}
|
@@ -13,7 +13,7 @@ export class OpenAICostCalculator {
|
|
13
13
|
});
|
14
14
|
}
|
15
15
|
async calculateCostInMillicents(call) {
|
16
|
-
const type = call.
|
16
|
+
const type = call.functionType;
|
17
17
|
const model = call.model.modelName;
|
18
18
|
switch (type) {
|
19
19
|
case "image-generation": {
|
@@ -28,7 +28,7 @@ export class OpenAICostCalculator {
|
|
28
28
|
if (isOpenAIEmbeddingModel(model)) {
|
29
29
|
return calculateOpenAIEmbeddingCostInMillicents({
|
30
30
|
model,
|
31
|
-
responses: call.response,
|
31
|
+
responses: call.result.response,
|
32
32
|
});
|
33
33
|
}
|
34
34
|
break;
|
@@ -41,13 +41,13 @@ export class OpenAICostCalculator {
|
|
41
41
|
if (isOpenAIChatModel(model)) {
|
42
42
|
return calculateOpenAIChatCostInMillicents({
|
43
43
|
model,
|
44
|
-
response: call.response,
|
44
|
+
response: call.result.response,
|
45
45
|
});
|
46
46
|
}
|
47
47
|
if (isOpenAITextGenerationModel(model)) {
|
48
48
|
return calculateOpenAITextGenerationCostInMillicents({
|
49
49
|
model,
|
50
|
-
response: call.response,
|
50
|
+
response: call.result.response,
|
51
51
|
});
|
52
52
|
}
|
53
53
|
break;
|
@@ -58,7 +58,8 @@ export class OpenAICostCalculator {
|
|
58
58
|
}
|
59
59
|
return calculateOpenAITranscriptionCostInMillicents({
|
60
60
|
model: model,
|
61
|
-
response: call.
|
61
|
+
response: call.result
|
62
|
+
.response,
|
62
63
|
});
|
63
64
|
}
|
64
65
|
}
|
@@ -121,7 +121,7 @@ class OpenAITextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
|
|
121
121
|
return this.callAPI(texts, options);
|
122
122
|
}
|
123
123
|
extractEmbeddings(response) {
|
124
|
-
return
|
124
|
+
return response.data.map((data) => data.embedding);
|
125
125
|
}
|
126
126
|
withSettings(additionalSettings) {
|
127
127
|
return new OpenAITextEmbeddingModel(Object.assign({}, this.settings, additionalSettings));
|
@@ -113,7 +113,7 @@ export class OpenAITextEmbeddingModel extends AbstractModel {
|
|
113
113
|
return this.callAPI(texts, options);
|
114
114
|
}
|
115
115
|
extractEmbeddings(response) {
|
116
|
-
return
|
116
|
+
return response.data.map((data) => data.embedding);
|
117
117
|
}
|
118
118
|
withSettings(additionalSettings) {
|
119
119
|
return new OpenAITextEmbeddingModel(Object.assign({}, this.settings, additionalSettings));
|
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.OpenAIChatResponseFormat = exports.OpenAIChatModel = exports.calculateOpenAIChatCostInMillicents = exports.isOpenAIChatModel = exports.getOpenAIChatModelInformation = exports.OPENAI_CHAT_MODELS = void 0;
|
7
7
|
const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
|
8
8
|
const zod_1 = __importDefault(require("zod"));
|
9
|
-
const AbstractModel_js_1 = require("../../../model-function/AbstractModel.cjs");
|
10
|
-
const PromptFormatTextGenerationModel_js_1 = require("../../../prompt/PromptFormatTextGenerationModel.cjs");
|
11
9
|
const callWithRetryAndThrottle_js_1 = require("../../../core/api/callWithRetryAndThrottle.cjs");
|
12
10
|
const postToApi_js_1 = require("../../../core/api/postToApi.cjs");
|
11
|
+
const AbstractModel_js_1 = require("../../../model-function/AbstractModel.cjs");
|
12
|
+
const PromptFormatTextGenerationModel_js_1 = require("../../../prompt/PromptFormatTextGenerationModel.cjs");
|
13
13
|
const OpenAIApiConfiguration_js_1 = require("../OpenAIApiConfiguration.cjs");
|
14
14
|
const OpenAIError_js_1 = require("../OpenAIError.cjs");
|
15
15
|
const TikTokenTokenizer_js_1 = require("../TikTokenTokenizer.cjs");
|
@@ -245,15 +245,21 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
245
245
|
*
|
246
246
|
* @see https://platform.openai.com/docs/guides/gpt/function-calling
|
247
247
|
*/
|
248
|
-
generateStructureResponse(prompt, options) {
|
249
|
-
|
250
|
-
functionCall: prompt.functionCall,
|
251
|
-
functions: prompt.functions,
|
252
|
-
});
|
253
|
-
return this.callAPI(prompt.messages, {
|
248
|
+
generateStructureResponse(structureDefinition, prompt, options) {
|
249
|
+
return this.callAPI(prompt, {
|
254
250
|
responseFormat: exports.OpenAIChatResponseFormat.json,
|
255
251
|
functionId: options?.functionId,
|
256
|
-
settings:
|
252
|
+
settings: {
|
253
|
+
...options,
|
254
|
+
functionCall: { name: structureDefinition.name },
|
255
|
+
functions: [
|
256
|
+
{
|
257
|
+
name: structureDefinition.name,
|
258
|
+
description: structureDefinition.description,
|
259
|
+
parameters: structureDefinition.schema.getJsonSchema(),
|
260
|
+
},
|
261
|
+
],
|
262
|
+
},
|
257
263
|
run: options?.run,
|
258
264
|
});
|
259
265
|
}
|
@@ -261,6 +267,38 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
261
267
|
const jsonText = response.choices[0].message.function_call.arguments;
|
262
268
|
return secure_json_parse_1.default.parse(jsonText);
|
263
269
|
}
|
270
|
+
generateStructureOrTextResponse(structureDefinitions, prompt, options) {
|
271
|
+
return this.callAPI(prompt, {
|
272
|
+
responseFormat: exports.OpenAIChatResponseFormat.json,
|
273
|
+
functionId: options?.functionId,
|
274
|
+
settings: {
|
275
|
+
...options,
|
276
|
+
functionCall: "auto",
|
277
|
+
functions: structureDefinitions.map((structureDefinition) => ({
|
278
|
+
name: structureDefinition.name,
|
279
|
+
description: structureDefinition.description,
|
280
|
+
parameters: structureDefinition.schema.getJsonSchema(),
|
281
|
+
})),
|
282
|
+
},
|
283
|
+
run: options?.run,
|
284
|
+
});
|
285
|
+
}
|
286
|
+
extractStructureAndText(response) {
|
287
|
+
const message = response.choices[0].message;
|
288
|
+
const content = message.content;
|
289
|
+
const functionCall = message.function_call;
|
290
|
+
return functionCall == null
|
291
|
+
? {
|
292
|
+
structure: null,
|
293
|
+
value: null,
|
294
|
+
text: content ?? "",
|
295
|
+
}
|
296
|
+
: {
|
297
|
+
structure: functionCall.name,
|
298
|
+
value: secure_json_parse_1.default.parse(functionCall.arguments),
|
299
|
+
text: content,
|
300
|
+
};
|
301
|
+
}
|
264
302
|
extractUsage(response) {
|
265
303
|
return {
|
266
304
|
promptTokens: response.usage.prompt_tokens,
|