modelfusion 0.30.1 → 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.
Files changed (61) hide show
  1. package/README.md +7 -11
  2. package/model-function/SuccessfulModelCall.cjs +2 -9
  3. package/model-function/SuccessfulModelCall.d.ts +10 -7
  4. package/model-function/SuccessfulModelCall.js +2 -9
  5. package/model-function/generate-structure/StructureFromTextGenerationModel.cjs +2 -2
  6. package/model-function/generate-structure/StructureFromTextGenerationModel.d.ts +5 -9
  7. package/model-function/generate-structure/StructureFromTextGenerationModel.js +2 -2
  8. package/model-function/generate-structure/StructureGenerationModel.d.ts +3 -2
  9. package/model-function/generate-structure/StructureOrTextGenerationModel.d.ts +4 -5
  10. package/model-function/generate-structure/generateStructure.cjs +5 -2
  11. package/model-function/generate-structure/generateStructure.d.ts +1 -1
  12. package/model-function/generate-structure/generateStructure.js +5 -2
  13. package/model-function/generate-structure/generateStructureOrText.cjs +8 -5
  14. package/model-function/generate-structure/generateStructureOrText.d.ts +2 -2
  15. package/model-function/generate-structure/generateStructureOrText.js +8 -5
  16. package/model-function/index.cjs +2 -3
  17. package/model-function/index.d.ts +2 -3
  18. package/model-function/index.js +2 -3
  19. package/model-provider/openai/OpenAICostCalculator.cjs +6 -5
  20. package/model-provider/openai/OpenAICostCalculator.js +6 -5
  21. package/model-provider/openai/chat/OpenAIChatModel.cjs +47 -9
  22. package/model-provider/openai/chat/OpenAIChatModel.d.ts +15 -5
  23. package/model-provider/openai/chat/OpenAIChatModel.js +47 -9
  24. package/model-provider/openai/chat/OpenAIChatPromptFormat.cjs +78 -0
  25. package/model-provider/openai/chat/OpenAIChatPromptFormat.d.ts +12 -0
  26. package/model-provider/openai/chat/OpenAIChatPromptFormat.js +73 -0
  27. package/model-provider/openai/index.cjs +2 -3
  28. package/model-provider/openai/index.d.ts +1 -1
  29. package/model-provider/openai/index.js +1 -1
  30. package/package.json +1 -1
  31. package/prompt/AlpacaPromptFormat.cjs +23 -21
  32. package/prompt/AlpacaPromptFormat.d.ts +1 -1
  33. package/prompt/AlpacaPromptFormat.js +21 -19
  34. package/prompt/InstructionPrompt.d.ts +9 -0
  35. package/prompt/Llama2PromptFormat.cjs +44 -40
  36. package/prompt/Llama2PromptFormat.d.ts +2 -2
  37. package/prompt/Llama2PromptFormat.js +41 -37
  38. package/prompt/TextPromptFormat.cjs +5 -5
  39. package/prompt/TextPromptFormat.d.ts +2 -2
  40. package/prompt/TextPromptFormat.js +2 -2
  41. package/prompt/VicunaPromptFormat.cjs +39 -37
  42. package/prompt/VicunaPromptFormat.d.ts +1 -1
  43. package/prompt/VicunaPromptFormat.js +37 -35
  44. package/prompt/index.cjs +0 -1
  45. package/prompt/index.d.ts +0 -1
  46. package/prompt/index.js +0 -1
  47. package/tool/useTool.cjs +5 -1
  48. package/tool/useTool.d.ts +1 -1
  49. package/tool/useTool.js +5 -1
  50. package/tool/useToolOrGenerateText.cjs +5 -2
  51. package/tool/useToolOrGenerateText.d.ts +2 -2
  52. package/tool/useToolOrGenerateText.js +5 -2
  53. package/model-function/generate-structure/InstructionWithStructurePrompt.cjs +0 -17
  54. package/model-function/generate-structure/InstructionWithStructurePrompt.d.ts +0 -17
  55. package/model-function/generate-structure/InstructionWithStructurePrompt.js +0 -14
  56. package/model-provider/openai/chat/OpenAIChatPrompt.cjs +0 -135
  57. package/model-provider/openai/chat/OpenAIChatPrompt.d.ts +0 -96
  58. package/model-provider/openai/chat/OpenAIChatPrompt.js +0 -127
  59. package/prompt/OpenAIChatPromptFormat.cjs +0 -74
  60. package/prompt/OpenAIChatPromptFormat.d.ts +0 -12
  61. 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(Llama2InstructionPromptFormat()),
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(OpenAIChatChatPromptFormat()),
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
- OpenAIChatFunctionPrompt.forStructureCurried([
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
- OpenAIChatFunctionPrompt.forStructuresCurried([OpenAIChatMessage.user(query)])
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
- OpenAIChatFunctionPrompt.forToolCurried([
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
- OpenAIChatFunctionPrompt.forToolsCurried([
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 { ModelInformation } from "./ModelInformation.js";
3
- export type SuccessfulModelCall = {
4
- type: "image-description" | "image-generation" | "structure-generation" | "structure-or-text-generation" | "speech-synthesis" | "text-embedding" | "text-generation" | "text-streaming" | "transcription";
5
- model: ModelInformation;
6
- settings: unknown;
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[]): SuccessfulModelCall[];
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
  }
@@ -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<InstructionWithStructure<string, unknown>, string, MODEL["settings"]> {
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(prompt: InstructionWithStructure<string, unknown>, options?: ModelFunctionOptions<MODEL["settings"]> | undefined): Promise<string>;
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 { ModelFunctionOptions } from "../ModelFunctionOptions.js";
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 { ModelFunctionOptions } from "../ModelFunctionOptions.js";
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 StructureOrTextGenerationPrompt<RESPONSE> {
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
- const expandedPrompt = prompt(structureDefinition);
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
- const expandedPrompt = prompt(structureDefinition);
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, structures, prompt, options) {
8
- const expandedPrompt = prompt(structures);
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.generateStructureResponse(expandedPrompt, options),
17
+ generateResponse: (options) => model.generateStructureOrTextResponse(structureDefinitions, expandedPrompt, options),
15
18
  extractOutputValue: (response) => {
16
- const { structure, value, text } = expandedPrompt.extractStructureAndText(response);
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 = structures.find((d) => d.name === structure);
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, StructureOrTextGenerationPrompt } from "./StructureOrTextGenerationModel.js";
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>, structures: STRUCTURES, prompt: (structures: STRUCTURES) => PROMPT & StructureOrTextGenerationPrompt<RESPONSE>, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<{
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, structures, prompt, options) {
5
- const expandedPrompt = prompt(structures);
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.generateStructureResponse(expandedPrompt, options),
14
+ generateResponse: (options) => model.generateStructureOrTextResponse(structureDefinitions, expandedPrompt, options),
12
15
  extractOutputValue: (response) => {
13
- const { structure, value, text } = expandedPrompt.extractStructureAndText(response);
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 = structures.find((d) => d.name === structure);
21
+ const definition = structureDefinitions.find((d) => d.name === structure);
19
22
  if (definition == undefined) {
20
23
  throw new NoSuchStructureError(structure);
21
24
  }
@@ -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/InstructionWithStructurePrompt.cjs"), exports);
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/InstructionWithStructurePrompt.js";
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";
@@ -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/InstructionWithStructurePrompt.js";
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.type;
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.response,
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.type;
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.response,
61
+ response: call.result
62
+ .response,
62
63
  });
63
64
  }
64
65
  }
@@ -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
- const settingsWithFunctionCall = Object.assign({}, options, {
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: settingsWithFunctionCall,
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,
@@ -1,17 +1,17 @@
1
1
  import z from "zod";
2
+ import { ApiConfiguration } from "../../../core/api/ApiConfiguration.js";
3
+ import { ResponseHandler } from "../../../core/api/postToApi.js";
4
+ import { StructureDefinition } from "../../../core/structure/StructureDefinition.js";
2
5
  import { AbstractModel } from "../../../model-function/AbstractModel.js";
3
6
  import { ModelFunctionOptions } from "../../../model-function/ModelFunctionOptions.js";
4
- import { ApiConfiguration } from "../../../core/api/ApiConfiguration.js";
5
7
  import { StructureGenerationModel } from "../../../model-function/generate-structure/StructureGenerationModel.js";
6
8
  import { StructureOrTextGenerationModel } from "../../../model-function/generate-structure/StructureOrTextGenerationModel.js";
7
9
  import { DeltaEvent } from "../../../model-function/generate-text/DeltaEvent.js";
8
10
  import { TextGenerationModel, TextGenerationModelSettings } from "../../../model-function/generate-text/TextGenerationModel.js";
9
11
  import { PromptFormat } from "../../../prompt/PromptFormat.js";
10
12
  import { PromptFormatTextGenerationModel } from "../../../prompt/PromptFormatTextGenerationModel.js";
11
- import { ResponseHandler } from "../../../core/api/postToApi.js";
12
13
  import { TikTokenTokenizer } from "../TikTokenTokenizer.js";
13
14
  import { OpenAIChatMessage } from "./OpenAIChatMessage.js";
14
- import { OpenAIChatAutoFunctionPrompt, OpenAIChatSingleFunctionPrompt, OpenAIFunctionDescription } from "./OpenAIChatPrompt.js";
15
15
  import { OpenAIChatDelta } from "./OpenAIChatStreamIterable.js";
16
16
  export declare const OPENAI_CHAT_MODELS: {
17
17
  "gpt-4": {
@@ -132,7 +132,7 @@ export interface OpenAIChatSettings extends TextGenerationModelSettings, Omit<Op
132
132
  * ),
133
133
  * ]);
134
134
  */
135
- export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> implements TextGenerationModel<OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatDelta, OpenAIChatSettings>, StructureGenerationModel<OpenAIChatSingleFunctionPrompt<unknown>, OpenAIChatResponse, OpenAIChatSettings>, StructureOrTextGenerationModel<OpenAIChatAutoFunctionPrompt<Array<OpenAIFunctionDescription<unknown>>>, OpenAIChatResponse, OpenAIChatSettings> {
135
+ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> implements TextGenerationModel<OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatDelta, OpenAIChatSettings>, StructureGenerationModel<OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatSettings>, StructureOrTextGenerationModel<OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatSettings> {
136
136
  constructor(settings: OpenAIChatSettings);
137
137
  readonly provider: "openai";
138
138
  get modelName(): OpenAIChatModelType;
@@ -183,8 +183,18 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
183
183
  *
184
184
  * @see https://platform.openai.com/docs/guides/gpt/function-calling
185
185
  */
186
- generateStructureResponse(prompt: OpenAIChatSingleFunctionPrompt<unknown> | OpenAIChatAutoFunctionPrompt<Array<OpenAIFunctionDescription<unknown>>>, options?: ModelFunctionOptions<OpenAIChatSettings> | undefined): PromiseLike<OpenAIChatResponse>;
186
+ generateStructureResponse(structureDefinition: StructureDefinition<string, unknown>, prompt: OpenAIChatMessage[], options?: ModelFunctionOptions<OpenAIChatSettings> | undefined): PromiseLike<OpenAIChatResponse>;
187
187
  extractStructure(response: OpenAIChatResponse): unknown;
188
+ generateStructureOrTextResponse(structureDefinitions: Array<StructureDefinition<string, unknown>>, prompt: OpenAIChatMessage[], options?: ModelFunctionOptions<OpenAIChatSettings> | undefined): PromiseLike<OpenAIChatResponse>;
189
+ extractStructureAndText(response: OpenAIChatResponse): {
190
+ structure: null;
191
+ value: null;
192
+ text: string;
193
+ } | {
194
+ structure: string;
195
+ value: any;
196
+ text: string | null;
197
+ };
188
198
  extractUsage(response: OpenAIChatResponse): {
189
199
  promptTokens: number;
190
200
  completionTokens: number;