modelfusion 0.130.1 → 0.131.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/CHANGELOG.md +64 -0
- package/README.md +22 -21
- package/core/api/postToApi.cjs +1 -1
- package/core/api/postToApi.js +1 -1
- package/core/schema/JsonSchemaProducer.d.ts +1 -1
- package/core/schema/Schema.d.ts +7 -7
- package/core/schema/TypeValidationError.cjs +5 -5
- package/core/schema/TypeValidationError.d.ts +4 -4
- package/core/schema/TypeValidationError.js +5 -5
- package/core/schema/UncheckedSchema.cjs +2 -2
- package/core/schema/UncheckedSchema.d.ts +5 -5
- package/core/schema/UncheckedSchema.js +2 -2
- package/core/schema/ZodSchema.cjs +5 -2
- package/core/schema/ZodSchema.d.ts +9 -9
- package/core/schema/ZodSchema.js +5 -2
- package/core/schema/parseJSON.cjs +6 -6
- package/core/schema/parseJSON.d.ts +3 -3
- package/core/schema/parseJSON.js +6 -6
- package/core/schema/validateTypes.cjs +13 -13
- package/core/schema/validateTypes.d.ts +9 -9
- package/core/schema/validateTypes.js +13 -13
- package/model-function/ModelCallEvent.d.ts +4 -4
- package/model-function/PromptTemplate.d.ts +2 -2
- package/model-function/{generate-structure/StructureFromTextGenerationModel.cjs → generate-object/ObjectFromTextGenerationModel.cjs} +8 -8
- package/model-function/{generate-structure/StructureFromTextGenerationModel.d.ts → generate-object/ObjectFromTextGenerationModel.d.ts} +6 -6
- package/model-function/{generate-structure/StructureFromTextGenerationModel.js → generate-object/ObjectFromTextGenerationModel.js} +6 -6
- package/model-function/{generate-structure/StructureFromTextPromptTemplate.d.ts → generate-object/ObjectFromTextPromptTemplate.d.ts} +4 -4
- package/model-function/{generate-structure/StructureFromTextStreamingModel.cjs → generate-object/ObjectFromTextStreamingModel.cjs} +10 -10
- package/model-function/generate-object/ObjectFromTextStreamingModel.d.ts +19 -0
- package/model-function/{generate-structure/StructureFromTextStreamingModel.js → generate-object/ObjectFromTextStreamingModel.js} +8 -8
- package/model-function/{generate-structure/StructureGenerationEvent.d.ts → generate-object/ObjectGenerationEvent.d.ts} +6 -6
- package/model-function/generate-object/ObjectGenerationModel.d.ts +24 -0
- package/model-function/{generate-structure/StructureParseError.cjs → generate-object/ObjectParseError.cjs} +5 -5
- package/model-function/{generate-structure/StructureParseError.d.ts → generate-object/ObjectParseError.d.ts} +1 -1
- package/model-function/{generate-structure/StructureParseError.js → generate-object/ObjectParseError.js} +3 -3
- package/model-function/generate-object/ObjectStream.cjs +57 -0
- package/model-function/generate-object/ObjectStream.d.ts +32 -0
- package/model-function/generate-object/ObjectStream.js +52 -0
- package/model-function/generate-object/ObjectStreamingEvent.d.ts +7 -0
- package/model-function/{generate-structure/StructureValidationError.cjs → generate-object/ObjectValidationError.cjs} +5 -5
- package/model-function/{generate-structure/StructureValidationError.d.ts → generate-object/ObjectValidationError.d.ts} +1 -1
- package/model-function/{generate-structure/StructureValidationError.js → generate-object/ObjectValidationError.js} +3 -3
- package/model-function/{generate-structure/generateStructure.cjs → generate-object/generateObject.cjs} +11 -12
- package/model-function/generate-object/generateObject.d.ts +56 -0
- package/model-function/{generate-structure/generateStructure.js → generate-object/generateObject.js} +9 -10
- package/model-function/{generate-structure → generate-object}/index.cjs +12 -11
- package/model-function/generate-object/index.d.ts +12 -0
- package/model-function/generate-object/index.js +12 -0
- package/model-function/{generate-structure/jsonStructurePrompt.cjs → generate-object/jsonObjectPrompt.cjs} +6 -6
- package/model-function/{generate-structure/jsonStructurePrompt.d.ts → generate-object/jsonObjectPrompt.d.ts} +6 -6
- package/model-function/{generate-structure/jsonStructurePrompt.js → generate-object/jsonObjectPrompt.js} +5 -5
- package/model-function/generate-object/streamObject.cjs +80 -0
- package/model-function/generate-object/streamObject.d.ts +57 -0
- package/model-function/generate-object/streamObject.js +76 -0
- package/model-function/generate-text/PromptTemplateTextGenerationModel.cjs +3 -3
- package/model-function/generate-text/PromptTemplateTextGenerationModel.d.ts +3 -3
- package/model-function/generate-text/PromptTemplateTextGenerationModel.js +3 -3
- package/model-function/generate-text/PromptTemplateTextStreamingModel.cjs +3 -3
- package/model-function/generate-text/PromptTemplateTextStreamingModel.d.ts +3 -3
- package/model-function/generate-text/PromptTemplateTextStreamingModel.js +3 -3
- package/model-function/generate-text/TextGenerationPromptTemplate.d.ts +1 -1
- package/model-function/index.cjs +1 -1
- package/model-function/index.d.ts +1 -1
- package/model-function/index.js +1 -1
- package/model-provider/cohere/CohereTextGenerationModel.cjs +1 -1
- package/model-provider/cohere/CohereTextGenerationModel.js +1 -1
- package/model-provider/elevenlabs/ElevenLabsSpeechModel.cjs +1 -1
- package/model-provider/elevenlabs/ElevenLabsSpeechModel.js +1 -1
- package/model-provider/huggingface/HuggingFaceTextGenerationModel.cjs +1 -1
- package/model-provider/huggingface/HuggingFaceTextGenerationModel.js +1 -1
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.cjs +1 -1
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.d.ts +1 -1
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.js +1 -1
- package/model-provider/llamacpp/LlamaCppCompletionModel.cjs +5 -5
- package/model-provider/llamacpp/LlamaCppCompletionModel.d.ts +3 -3
- package/model-provider/llamacpp/LlamaCppCompletionModel.js +5 -5
- package/model-provider/mistral/MistralChatModel.cjs +1 -1
- package/model-provider/mistral/MistralChatModel.js +1 -1
- package/model-provider/ollama/OllamaChatModel.cjs +7 -7
- package/model-provider/ollama/OllamaChatModel.d.ts +3 -3
- package/model-provider/ollama/OllamaChatModel.js +7 -7
- package/model-provider/ollama/OllamaCompletionModel.cjs +7 -7
- package/model-provider/ollama/OllamaCompletionModel.d.ts +3 -3
- package/model-provider/ollama/OllamaCompletionModel.js +7 -7
- package/model-provider/ollama/OllamaCompletionModel.test.cjs +8 -6
- package/model-provider/ollama/OllamaCompletionModel.test.js +8 -6
- package/model-provider/openai/AbstractOpenAIChatModel.cjs +1 -1
- package/model-provider/openai/AbstractOpenAIChatModel.js +1 -1
- package/model-provider/openai/AbstractOpenAICompletionModel.cjs +1 -1
- package/model-provider/openai/AbstractOpenAICompletionModel.js +1 -1
- package/model-provider/openai/{OpenAIChatFunctionCallStructureGenerationModel.cjs → OpenAIChatFunctionCallObjectGenerationModel.cjs} +12 -12
- package/model-provider/openai/{OpenAIChatFunctionCallStructureGenerationModel.d.ts → OpenAIChatFunctionCallObjectGenerationModel.d.ts} +10 -10
- package/model-provider/openai/{OpenAIChatFunctionCallStructureGenerationModel.js → OpenAIChatFunctionCallObjectGenerationModel.js} +10 -10
- package/model-provider/openai/OpenAIChatModel.cjs +7 -7
- package/model-provider/openai/OpenAIChatModel.d.ts +6 -6
- package/model-provider/openai/OpenAIChatModel.js +7 -7
- package/model-provider/openai/OpenAIChatModel.test.cjs +7 -5
- package/model-provider/openai/OpenAIChatModel.test.js +7 -5
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.cjs +4 -4
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.d.ts +3 -3
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.js +4 -4
- package/model-provider/whispercpp/WhisperCppTranscriptionModel.cjs +3 -3
- package/model-provider/whispercpp/WhisperCppTranscriptionModel.js +3 -3
- package/package.json +3 -3
- package/tool/WebSearchTool.cjs +1 -1
- package/tool/WebSearchTool.js +1 -1
- package/tool/generate-tool-call/generateToolCall.cjs +1 -1
- package/tool/generate-tool-call/generateToolCall.js +1 -1
- package/tool/generate-tool-calls/generateToolCalls.cjs +1 -1
- package/tool/generate-tool-calls/generateToolCalls.js +1 -1
- package/{model-function/generate-structure → util}/fixJson.test.cjs +1 -1
- package/{model-function/generate-structure → util}/fixJson.test.js +1 -1
- package/util/isDeepEqualData.cjs +1 -1
- package/util/isDeepEqualData.d.ts +1 -1
- package/util/isDeepEqualData.js +1 -1
- package/util/streaming/parseEventSourceStreamAsAsyncIterable.cjs +1 -1
- package/util/streaming/parseEventSourceStreamAsAsyncIterable.js +1 -1
- package/vector-index/memory/MemoryVectorIndex.cjs +1 -1
- package/vector-index/memory/MemoryVectorIndex.js +1 -1
- package/model-function/generate-structure/StructureFromTextStreamingModel.d.ts +0 -19
- package/model-function/generate-structure/StructureGenerationModel.d.ts +0 -24
- package/model-function/generate-structure/StructureStreamingEvent.d.ts +0 -7
- package/model-function/generate-structure/generateStructure.d.ts +0 -56
- package/model-function/generate-structure/index.d.ts +0 -11
- package/model-function/generate-structure/index.js +0 -11
- package/model-function/generate-structure/streamStructure.cjs +0 -61
- package/model-function/generate-structure/streamStructure.d.ts +0 -67
- package/model-function/generate-structure/streamStructure.js +0 -57
- /package/model-function/{generate-structure/StructureFromTextPromptTemplate.cjs → generate-object/ObjectFromTextPromptTemplate.cjs} +0 -0
- /package/model-function/{generate-structure/StructureFromTextPromptTemplate.js → generate-object/ObjectFromTextPromptTemplate.js} +0 -0
- /package/model-function/{generate-structure/StructureGenerationEvent.cjs → generate-object/ObjectGenerationEvent.cjs} +0 -0
- /package/model-function/{generate-structure/StructureGenerationEvent.js → generate-object/ObjectGenerationEvent.js} +0 -0
- /package/model-function/{generate-structure/StructureGenerationModel.cjs → generate-object/ObjectGenerationModel.cjs} +0 -0
- /package/model-function/{generate-structure/StructureGenerationModel.js → generate-object/ObjectGenerationModel.js} +0 -0
- /package/model-function/{generate-structure/StructureStreamingEvent.cjs → generate-object/ObjectStreamingEvent.cjs} +0 -0
- /package/model-function/{generate-structure/StructureStreamingEvent.js → generate-object/ObjectStreamingEvent.js} +0 -0
- /package/{model-function/generate-structure → util}/fixJson.cjs +0 -0
- /package/{model-function/generate-structure → util}/fixJson.d.ts +0 -0
- /package/{model-function/generate-structure → util}/fixJson.js +0 -0
- /package/{model-function/generate-structure → util}/fixJson.test.d.ts +0 -0
- /package/{model-function/generate-structure → util}/parsePartialJson.cjs +0 -0
- /package/{model-function/generate-structure → util}/parsePartialJson.d.ts +0 -0
- /package/{model-function/generate-structure → util}/parsePartialJson.js +0 -0
@@ -1,10 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.ObjectValidationError = void 0;
|
4
4
|
const getErrorMessage_js_1 = require("../../util/getErrorMessage.cjs");
|
5
|
-
class
|
5
|
+
class ObjectValidationError extends Error {
|
6
6
|
constructor({ value, valueText, cause, }) {
|
7
|
-
super(`
|
7
|
+
super(`Object validation failed. ` +
|
8
8
|
`Value: ${valueText}.\n` +
|
9
9
|
`Error message: ${(0, getErrorMessage_js_1.getErrorMessage)(cause)}`);
|
10
10
|
Object.defineProperty(this, "cause", {
|
@@ -25,7 +25,7 @@ class StructureValidationError extends Error {
|
|
25
25
|
writable: true,
|
26
26
|
value: void 0
|
27
27
|
});
|
28
|
-
this.name = "
|
28
|
+
this.name = "ObjectValidationError";
|
29
29
|
this.cause = cause;
|
30
30
|
this.value = value;
|
31
31
|
this.valueText = valueText;
|
@@ -41,4 +41,4 @@ class StructureValidationError extends Error {
|
|
41
41
|
};
|
42
42
|
}
|
43
43
|
}
|
44
|
-
exports.
|
44
|
+
exports.ObjectValidationError = ObjectValidationError;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { getErrorMessage } from "../../util/getErrorMessage.js";
|
2
|
-
export class
|
2
|
+
export class ObjectValidationError extends Error {
|
3
3
|
constructor({ value, valueText, cause, }) {
|
4
|
-
super(`
|
4
|
+
super(`Object validation failed. ` +
|
5
5
|
`Value: ${valueText}.\n` +
|
6
6
|
`Error message: ${getErrorMessage(cause)}`);
|
7
7
|
Object.defineProperty(this, "cause", {
|
@@ -22,7 +22,7 @@ export class StructureValidationError extends Error {
|
|
22
22
|
writable: true,
|
23
23
|
value: void 0
|
24
24
|
});
|
25
|
-
this.name = "
|
25
|
+
this.name = "ObjectValidationError";
|
26
26
|
this.cause = cause;
|
27
27
|
this.value = value;
|
28
28
|
this.valueText = valueText;
|
@@ -1,15 +1,15 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.generateObject = void 0;
|
4
4
|
const executeStandardCall_js_1 = require("../executeStandardCall.cjs");
|
5
|
-
const
|
6
|
-
async function
|
5
|
+
const ObjectValidationError_js_1 = require("./ObjectValidationError.cjs");
|
6
|
+
async function generateObject({ model, schema, prompt, fullResponse, ...options }) {
|
7
7
|
// Note: PROMPT must not be a function.
|
8
8
|
const expandedPrompt = typeof prompt === "function"
|
9
9
|
? prompt(schema)
|
10
10
|
: prompt;
|
11
11
|
const callResponse = await (0, executeStandardCall_js_1.executeStandardCall)({
|
12
|
-
functionType: "generate-
|
12
|
+
functionType: "generate-object",
|
13
13
|
input: {
|
14
14
|
schema,
|
15
15
|
prompt: expandedPrompt,
|
@@ -17,17 +17,16 @@ async function generateStructure({ model, schema, prompt, fullResponse, ...optio
|
|
17
17
|
model,
|
18
18
|
options,
|
19
19
|
generateResponse: async (options) => {
|
20
|
-
const result = await model.
|
21
|
-
const
|
22
|
-
const parseResult = schema.validate(structure);
|
20
|
+
const result = await model.doGenerateObject(schema, expandedPrompt, options);
|
21
|
+
const parseResult = schema.validate(result.value);
|
23
22
|
if (!parseResult.success) {
|
24
|
-
throw new
|
23
|
+
throw new ObjectValidationError_js_1.ObjectValidationError({
|
25
24
|
valueText: result.valueText,
|
26
|
-
value:
|
25
|
+
value: result.value,
|
27
26
|
cause: parseResult.error,
|
28
27
|
});
|
29
28
|
}
|
30
|
-
const value = parseResult.
|
29
|
+
const value = parseResult.value;
|
31
30
|
return {
|
32
31
|
rawResponse: result.rawResponse,
|
33
32
|
extractedValue: value,
|
@@ -37,10 +36,10 @@ async function generateStructure({ model, schema, prompt, fullResponse, ...optio
|
|
37
36
|
});
|
38
37
|
return fullResponse
|
39
38
|
? {
|
40
|
-
|
39
|
+
value: callResponse.value,
|
41
40
|
rawResponse: callResponse.rawResponse,
|
42
41
|
metadata: callResponse.metadata,
|
43
42
|
}
|
44
43
|
: callResponse.value;
|
45
44
|
}
|
46
|
-
exports.
|
45
|
+
exports.generateObject = generateObject;
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
|
+
import { JsonSchemaProducer } from "../../core/schema/JsonSchemaProducer.js";
|
3
|
+
import { Schema } from "../../core/schema/Schema.js";
|
4
|
+
import { ModelCallMetadata } from "../ModelCallMetadata.js";
|
5
|
+
import { ObjectGenerationModel, ObjectGenerationModelSettings } from "./ObjectGenerationModel.js";
|
6
|
+
/**
|
7
|
+
* Generate a typed object for a prompt and a schema.
|
8
|
+
*
|
9
|
+
* @see https://modelfusion.dev/guide/function/generate-object
|
10
|
+
*
|
11
|
+
* @example
|
12
|
+
* const sentiment = await generateObject({
|
13
|
+
* model: openai.ChatTextGenerator(...).asFunctionCallObjectGenerationModel(...),
|
14
|
+
*
|
15
|
+
* schema: zodSchema(z.object({
|
16
|
+
* sentiment: z
|
17
|
+
* .enum(["positive", "neutral", "negative"])
|
18
|
+
* .describe("Sentiment."),
|
19
|
+
* })),
|
20
|
+
*
|
21
|
+
* prompt: [
|
22
|
+
* openai.ChatMessage.system(
|
23
|
+
* "You are a sentiment evaluator. " +
|
24
|
+
* "Analyze the sentiment of the following product review:"
|
25
|
+
* ),
|
26
|
+
* openai.ChatMessage.user(
|
27
|
+
* "After I opened the package, I was met by a very unpleasant smell " +
|
28
|
+
* "that did not disappear even after washing. Never again!"
|
29
|
+
* ),
|
30
|
+
* ]
|
31
|
+
* });
|
32
|
+
*
|
33
|
+
* @param {ObjectGenerationModel<PROMPT, SETTINGS>} options.model - The model to generate the object.
|
34
|
+
* @param {Schema<OBJECT>} options.schema - The schema to be used.
|
35
|
+
* @param {PROMPT | ((schema: Schema<OBJECT>) => PROMPT)} options.prompt
|
36
|
+
* The prompt to be used.
|
37
|
+
* You can also pass a function that takes the schema as an argument and returns the prompt.
|
38
|
+
*
|
39
|
+
* @returns {Promise<OBJECT>} - Returns a promise that resolves to the generated object.
|
40
|
+
*/
|
41
|
+
export declare function generateObject<OBJECT, PROMPT, SETTINGS extends ObjectGenerationModelSettings>(args: {
|
42
|
+
model: ObjectGenerationModel<PROMPT, SETTINGS>;
|
43
|
+
schema: Schema<OBJECT> & JsonSchemaProducer;
|
44
|
+
prompt: PROMPT | ((schema: Schema<OBJECT>) => PROMPT);
|
45
|
+
fullResponse?: false;
|
46
|
+
} & FunctionOptions): Promise<OBJECT>;
|
47
|
+
export declare function generateObject<OBJECT, PROMPT, SETTINGS extends ObjectGenerationModelSettings>(args: {
|
48
|
+
model: ObjectGenerationModel<PROMPT, SETTINGS>;
|
49
|
+
schema: Schema<OBJECT> & JsonSchemaProducer;
|
50
|
+
prompt: PROMPT | ((schema: Schema<OBJECT>) => PROMPT);
|
51
|
+
fullResponse: true;
|
52
|
+
} & FunctionOptions): Promise<{
|
53
|
+
value: OBJECT;
|
54
|
+
rawResponse: unknown;
|
55
|
+
metadata: ModelCallMetadata;
|
56
|
+
}>;
|
package/model-function/{generate-structure/generateStructure.js → generate-object/generateObject.js}
RENAMED
@@ -1,12 +1,12 @@
|
|
1
1
|
import { executeStandardCall } from "../executeStandardCall.js";
|
2
|
-
import {
|
3
|
-
export async function
|
2
|
+
import { ObjectValidationError } from "./ObjectValidationError.js";
|
3
|
+
export async function generateObject({ model, schema, prompt, fullResponse, ...options }) {
|
4
4
|
// Note: PROMPT must not be a function.
|
5
5
|
const expandedPrompt = typeof prompt === "function"
|
6
6
|
? prompt(schema)
|
7
7
|
: prompt;
|
8
8
|
const callResponse = await executeStandardCall({
|
9
|
-
functionType: "generate-
|
9
|
+
functionType: "generate-object",
|
10
10
|
input: {
|
11
11
|
schema,
|
12
12
|
prompt: expandedPrompt,
|
@@ -14,17 +14,16 @@ export async function generateStructure({ model, schema, prompt, fullResponse, .
|
|
14
14
|
model,
|
15
15
|
options,
|
16
16
|
generateResponse: async (options) => {
|
17
|
-
const result = await model.
|
18
|
-
const
|
19
|
-
const parseResult = schema.validate(structure);
|
17
|
+
const result = await model.doGenerateObject(schema, expandedPrompt, options);
|
18
|
+
const parseResult = schema.validate(result.value);
|
20
19
|
if (!parseResult.success) {
|
21
|
-
throw new
|
20
|
+
throw new ObjectValidationError({
|
22
21
|
valueText: result.valueText,
|
23
|
-
value:
|
22
|
+
value: result.value,
|
24
23
|
cause: parseResult.error,
|
25
24
|
});
|
26
25
|
}
|
27
|
-
const value = parseResult.
|
26
|
+
const value = parseResult.value;
|
28
27
|
return {
|
29
28
|
rawResponse: result.rawResponse,
|
30
29
|
extractedValue: value,
|
@@ -34,7 +33,7 @@ export async function generateStructure({ model, schema, prompt, fullResponse, .
|
|
34
33
|
});
|
35
34
|
return fullResponse
|
36
35
|
? {
|
37
|
-
|
36
|
+
value: callResponse.value,
|
38
37
|
rawResponse: callResponse.rawResponse,
|
39
38
|
metadata: callResponse.metadata,
|
40
39
|
}
|
@@ -14,14 +14,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
15
|
};
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
-
__exportStar(require("./
|
18
|
-
__exportStar(require("./
|
19
|
-
__exportStar(require("./
|
20
|
-
__exportStar(require("./
|
21
|
-
__exportStar(require("./
|
22
|
-
__exportStar(require("./
|
23
|
-
__exportStar(require("./
|
24
|
-
__exportStar(require("./
|
25
|
-
__exportStar(require("./
|
26
|
-
__exportStar(require("./
|
27
|
-
__exportStar(require("./
|
17
|
+
__exportStar(require("./ObjectFromTextGenerationModel.cjs"), exports);
|
18
|
+
__exportStar(require("./ObjectFromTextPromptTemplate.cjs"), exports);
|
19
|
+
__exportStar(require("./ObjectFromTextStreamingModel.cjs"), exports);
|
20
|
+
__exportStar(require("./ObjectGenerationEvent.cjs"), exports);
|
21
|
+
__exportStar(require("./ObjectGenerationModel.cjs"), exports);
|
22
|
+
__exportStar(require("./ObjectParseError.cjs"), exports);
|
23
|
+
__exportStar(require("./ObjectStream.cjs"), exports);
|
24
|
+
__exportStar(require("./ObjectStreamingEvent.cjs"), exports);
|
25
|
+
__exportStar(require("./ObjectValidationError.cjs"), exports);
|
26
|
+
__exportStar(require("./generateObject.cjs"), exports);
|
27
|
+
__exportStar(require("./jsonObjectPrompt.cjs"), exports);
|
28
|
+
__exportStar(require("./streamObject.cjs"), exports);
|
@@ -0,0 +1,12 @@
|
|
1
|
+
export * from "./ObjectFromTextGenerationModel.js";
|
2
|
+
export * from "./ObjectFromTextPromptTemplate.js";
|
3
|
+
export * from "./ObjectFromTextStreamingModel.js";
|
4
|
+
export * from "./ObjectGenerationEvent.js";
|
5
|
+
export * from "./ObjectGenerationModel.js";
|
6
|
+
export * from "./ObjectParseError.js";
|
7
|
+
export * from "./ObjectStream.js";
|
8
|
+
export * from "./ObjectStreamingEvent.js";
|
9
|
+
export * from "./ObjectValidationError.js";
|
10
|
+
export * from "./generateObject.js";
|
11
|
+
export * from "./jsonObjectPrompt.js";
|
12
|
+
export * from "./streamObject.js";
|
@@ -0,0 +1,12 @@
|
|
1
|
+
export * from "./ObjectFromTextGenerationModel.js";
|
2
|
+
export * from "./ObjectFromTextPromptTemplate.js";
|
3
|
+
export * from "./ObjectFromTextStreamingModel.js";
|
4
|
+
export * from "./ObjectGenerationEvent.js";
|
5
|
+
export * from "./ObjectGenerationModel.js";
|
6
|
+
export * from "./ObjectParseError.js";
|
7
|
+
export * from "./ObjectStream.js";
|
8
|
+
export * from "./ObjectStreamingEvent.js";
|
9
|
+
export * from "./ObjectValidationError.js";
|
10
|
+
export * from "./generateObject.js";
|
11
|
+
export * from "./jsonObjectPrompt.js";
|
12
|
+
export * from "./streamObject.js";
|
@@ -1,12 +1,12 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.jsonObjectPrompt = void 0;
|
4
4
|
const parseJSON_js_1 = require("../../core/schema/parseJSON.cjs");
|
5
5
|
const DEFAULT_SCHEMA_PREFIX = "JSON schema:";
|
6
6
|
const DEFAULT_SCHEMA_SUFFIX = "\nYou MUST answer with a JSON object matches the above schema.";
|
7
|
-
exports.
|
7
|
+
exports.jsonObjectPrompt = {
|
8
8
|
custom(createPrompt) {
|
9
|
-
return { createPrompt,
|
9
|
+
return { createPrompt, extractObject };
|
10
10
|
},
|
11
11
|
text({ schemaPrefix, schemaSuffix, } = {}) {
|
12
12
|
return {
|
@@ -14,7 +14,7 @@ exports.jsonStructurePrompt = {
|
|
14
14
|
system: createSystemPrompt({ schema, schemaPrefix, schemaSuffix }),
|
15
15
|
instruction: prompt,
|
16
16
|
}),
|
17
|
-
|
17
|
+
extractObject,
|
18
18
|
adaptModel: (model) => model.withInstructionPrompt(),
|
19
19
|
withJsonOutput: ({ model, schema }) => model.withJsonOutput(schema),
|
20
20
|
};
|
@@ -30,7 +30,7 @@ exports.jsonStructurePrompt = {
|
|
30
30
|
}),
|
31
31
|
instruction: prompt.instruction,
|
32
32
|
}),
|
33
|
-
|
33
|
+
extractObject,
|
34
34
|
adaptModel: (model) => model.withInstructionPrompt(),
|
35
35
|
withJsonOutput: ({ model, schema }) => model.withJsonOutput(schema),
|
36
36
|
};
|
@@ -46,6 +46,6 @@ function createSystemPrompt({ originalSystemPrompt, schema, schemaPrefix = DEFAU
|
|
46
46
|
.filter(Boolean)
|
47
47
|
.join("\n");
|
48
48
|
}
|
49
|
-
function
|
49
|
+
function extractObject(response) {
|
50
50
|
return (0, parseJSON_js_1.parseJSON)({ text: response });
|
51
51
|
}
|
@@ -1,15 +1,15 @@
|
|
1
1
|
import { JsonSchemaProducer } from "../../core/schema/JsonSchemaProducer.js";
|
2
2
|
import { Schema } from "../../core/schema/Schema.js";
|
3
|
-
import { InstructionPrompt } from "
|
4
|
-
import {
|
5
|
-
export declare const
|
6
|
-
custom<SOURCE_PROMPT, TARGET_PROMPT>(createPrompt: (prompt: SOURCE_PROMPT, schema: Schema<unknown> & JsonSchemaProducer) => TARGET_PROMPT):
|
3
|
+
import { InstructionPrompt } from "../generate-text/prompt-template/InstructionPrompt.js";
|
4
|
+
import { FlexibleObjectFromTextPromptTemplate, ObjectFromTextPromptTemplate } from "./ObjectFromTextPromptTemplate.js";
|
5
|
+
export declare const jsonObjectPrompt: {
|
6
|
+
custom<SOURCE_PROMPT, TARGET_PROMPT>(createPrompt: (prompt: SOURCE_PROMPT, schema: Schema<unknown> & JsonSchemaProducer) => TARGET_PROMPT): ObjectFromTextPromptTemplate<SOURCE_PROMPT, TARGET_PROMPT>;
|
7
7
|
text({ schemaPrefix, schemaSuffix, }?: {
|
8
8
|
schemaPrefix?: string | undefined;
|
9
9
|
schemaSuffix?: string | undefined;
|
10
|
-
}):
|
10
|
+
}): FlexibleObjectFromTextPromptTemplate<string, InstructionPrompt>;
|
11
11
|
instruction({ schemaPrefix, schemaSuffix, }?: {
|
12
12
|
schemaPrefix?: string | undefined;
|
13
13
|
schemaSuffix?: string | undefined;
|
14
|
-
}):
|
14
|
+
}): FlexibleObjectFromTextPromptTemplate<InstructionPrompt, InstructionPrompt>;
|
15
15
|
};
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import { parseJSON } from "../../core/schema/parseJSON.js";
|
2
2
|
const DEFAULT_SCHEMA_PREFIX = "JSON schema:";
|
3
3
|
const DEFAULT_SCHEMA_SUFFIX = "\nYou MUST answer with a JSON object matches the above schema.";
|
4
|
-
export const
|
4
|
+
export const jsonObjectPrompt = {
|
5
5
|
custom(createPrompt) {
|
6
|
-
return { createPrompt,
|
6
|
+
return { createPrompt, extractObject };
|
7
7
|
},
|
8
8
|
text({ schemaPrefix, schemaSuffix, } = {}) {
|
9
9
|
return {
|
@@ -11,7 +11,7 @@ export const jsonStructurePrompt = {
|
|
11
11
|
system: createSystemPrompt({ schema, schemaPrefix, schemaSuffix }),
|
12
12
|
instruction: prompt,
|
13
13
|
}),
|
14
|
-
|
14
|
+
extractObject,
|
15
15
|
adaptModel: (model) => model.withInstructionPrompt(),
|
16
16
|
withJsonOutput: ({ model, schema }) => model.withJsonOutput(schema),
|
17
17
|
};
|
@@ -27,7 +27,7 @@ export const jsonStructurePrompt = {
|
|
27
27
|
}),
|
28
28
|
instruction: prompt.instruction,
|
29
29
|
}),
|
30
|
-
|
30
|
+
extractObject,
|
31
31
|
adaptModel: (model) => model.withInstructionPrompt(),
|
32
32
|
withJsonOutput: ({ model, schema }) => model.withJsonOutput(schema),
|
33
33
|
};
|
@@ -43,6 +43,6 @@ function createSystemPrompt({ originalSystemPrompt, schema, schemaPrefix = DEFAU
|
|
43
43
|
.filter(Boolean)
|
44
44
|
.join("\n");
|
45
45
|
}
|
46
|
-
function
|
46
|
+
function extractObject(response) {
|
47
47
|
return parseJSON({ text: response });
|
48
48
|
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.streamObject = void 0;
|
4
|
+
const isDeepEqualData_js_1 = require("../../util/isDeepEqualData.cjs");
|
5
|
+
const executeStreamCall_js_1 = require("../executeStreamCall.cjs");
|
6
|
+
async function streamObject({ model, schema, prompt, fullResponse, ...options }) {
|
7
|
+
// Note: PROMPT must not be a function.
|
8
|
+
const expandedPrompt = typeof prompt === "function"
|
9
|
+
? prompt(schema)
|
10
|
+
: prompt;
|
11
|
+
let accumulatedText = "";
|
12
|
+
let accumulatedTextDelta = "";
|
13
|
+
let latestObject;
|
14
|
+
let resolveObject;
|
15
|
+
let rejectObject;
|
16
|
+
const objectPromise = new Promise((resolve, reject) => {
|
17
|
+
resolveObject = resolve;
|
18
|
+
rejectObject = reject;
|
19
|
+
});
|
20
|
+
const callResponse = await (0, executeStreamCall_js_1.executeStreamCall)({
|
21
|
+
functionType: "stream-object",
|
22
|
+
input: {
|
23
|
+
schema,
|
24
|
+
prompt: expandedPrompt,
|
25
|
+
},
|
26
|
+
model,
|
27
|
+
options,
|
28
|
+
startStream: async (options) => model.doStreamObject(schema, expandedPrompt, options),
|
29
|
+
processDelta(delta) {
|
30
|
+
const textDelta = model.extractObjectTextDelta(delta.deltaValue);
|
31
|
+
if (textDelta == null) {
|
32
|
+
return undefined;
|
33
|
+
}
|
34
|
+
accumulatedText += textDelta;
|
35
|
+
accumulatedTextDelta += textDelta;
|
36
|
+
const currentObject = model.parseAccumulatedObjectText(accumulatedText);
|
37
|
+
// only send a new part into the stream when the partial object has changed:
|
38
|
+
if (!(0, isDeepEqualData_js_1.isDeepEqualData)(latestObject, currentObject)) {
|
39
|
+
latestObject = currentObject;
|
40
|
+
// reset delta accumulation:
|
41
|
+
const currentAccumulatedTextDelta = accumulatedTextDelta;
|
42
|
+
accumulatedTextDelta = "";
|
43
|
+
// TODO add type checking
|
44
|
+
return {
|
45
|
+
partialObject: latestObject,
|
46
|
+
partialText: accumulatedText,
|
47
|
+
textDelta: currentAccumulatedTextDelta,
|
48
|
+
};
|
49
|
+
}
|
50
|
+
return undefined;
|
51
|
+
},
|
52
|
+
// The last object is processed and returned, even if it was already returned previously.
|
53
|
+
// The reason is that the full text delta should be returned (and no characters should be omitted).
|
54
|
+
processFinished() {
|
55
|
+
return {
|
56
|
+
partialObject: latestObject,
|
57
|
+
partialText: accumulatedText,
|
58
|
+
textDelta: accumulatedTextDelta,
|
59
|
+
};
|
60
|
+
},
|
61
|
+
onDone() {
|
62
|
+
// process the final result (full type validation):
|
63
|
+
const parseResult = schema.validate(latestObject);
|
64
|
+
if (parseResult.success) {
|
65
|
+
resolveObject(parseResult.value);
|
66
|
+
}
|
67
|
+
else {
|
68
|
+
rejectObject(parseResult.error);
|
69
|
+
}
|
70
|
+
},
|
71
|
+
});
|
72
|
+
return fullResponse
|
73
|
+
? {
|
74
|
+
objectStream: callResponse.value,
|
75
|
+
objectPromise: objectPromise,
|
76
|
+
metadata: callResponse.metadata,
|
77
|
+
}
|
78
|
+
: callResponse.value;
|
79
|
+
}
|
80
|
+
exports.streamObject = streamObject;
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
|
+
import { JsonSchemaProducer } from "../../core/schema/JsonSchemaProducer.js";
|
3
|
+
import { Schema } from "../../core/schema/Schema.js";
|
4
|
+
import { ModelCallMetadata } from "../ModelCallMetadata.js";
|
5
|
+
import { ObjectStreamingModel } from "./ObjectGenerationModel.js";
|
6
|
+
import { ObjectStream } from "./ObjectStream.js";
|
7
|
+
/**
|
8
|
+
* Generate and stream an object for a prompt and a schema.
|
9
|
+
*
|
10
|
+
* @see https://modelfusion.dev/guide/function/generate-object
|
11
|
+
*
|
12
|
+
* @example
|
13
|
+
* const objectStream = await streamObject({
|
14
|
+
* model: openai.ChatTextGenerator(...).asFunctionCallObjectGenerationModel(...),
|
15
|
+
* schema: zodSchema(
|
16
|
+
* z.array(
|
17
|
+
* z.object({
|
18
|
+
* name: z.string(),
|
19
|
+
* class: z
|
20
|
+
* .string()
|
21
|
+
* .describe("Character class, e.g. warrior, mage, or thief."),
|
22
|
+
* description: z.string(),
|
23
|
+
* })
|
24
|
+
* ),
|
25
|
+
* prompt: [
|
26
|
+
* openai.ChatMessage.user(
|
27
|
+
* "Generate 3 character descriptions for a fantasy role playing game."
|
28
|
+
* ),
|
29
|
+
* ]
|
30
|
+
* });
|
31
|
+
*
|
32
|
+
* for await (const { partialObject } of objectStream) {
|
33
|
+
* // ...
|
34
|
+
* }
|
35
|
+
*
|
36
|
+
* @param {ObjectStreamingModel<PROMPT>} options.model - The model that generates the object
|
37
|
+
* @param {Schema<OBJECT>} options.schema - The schema of the object to be generated.
|
38
|
+
* @param {PROMPT | ((schema: Schema<OBJECT>) => PROMPT)} options.prompt
|
39
|
+
* The prompt to be used.
|
40
|
+
* You can also pass a function that takes the schema as an argument and returns the prompt.
|
41
|
+
*/
|
42
|
+
export declare function streamObject<OBJECT, PROMPT>(args: {
|
43
|
+
model: ObjectStreamingModel<PROMPT>;
|
44
|
+
schema: Schema<OBJECT> & JsonSchemaProducer;
|
45
|
+
prompt: PROMPT | ((schema: Schema<OBJECT>) => PROMPT);
|
46
|
+
fullResponse?: false;
|
47
|
+
} & FunctionOptions): Promise<ObjectStream<OBJECT>>;
|
48
|
+
export declare function streamObject<OBJECT, PROMPT>(args: {
|
49
|
+
model: ObjectStreamingModel<PROMPT>;
|
50
|
+
schema: Schema<OBJECT> & JsonSchemaProducer;
|
51
|
+
prompt: PROMPT | ((schema: Schema<OBJECT>) => PROMPT);
|
52
|
+
fullResponse: true;
|
53
|
+
} & FunctionOptions): Promise<{
|
54
|
+
objectStream: ObjectStream<OBJECT>;
|
55
|
+
objectPromise: PromiseLike<OBJECT>;
|
56
|
+
metadata: Omit<ModelCallMetadata, "durationInMs" | "finishTimestamp">;
|
57
|
+
}>;
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import { isDeepEqualData } from "../../util/isDeepEqualData.js";
|
2
|
+
import { executeStreamCall } from "../executeStreamCall.js";
|
3
|
+
export async function streamObject({ model, schema, prompt, fullResponse, ...options }) {
|
4
|
+
// Note: PROMPT must not be a function.
|
5
|
+
const expandedPrompt = typeof prompt === "function"
|
6
|
+
? prompt(schema)
|
7
|
+
: prompt;
|
8
|
+
let accumulatedText = "";
|
9
|
+
let accumulatedTextDelta = "";
|
10
|
+
let latestObject;
|
11
|
+
let resolveObject;
|
12
|
+
let rejectObject;
|
13
|
+
const objectPromise = new Promise((resolve, reject) => {
|
14
|
+
resolveObject = resolve;
|
15
|
+
rejectObject = reject;
|
16
|
+
});
|
17
|
+
const callResponse = await executeStreamCall({
|
18
|
+
functionType: "stream-object",
|
19
|
+
input: {
|
20
|
+
schema,
|
21
|
+
prompt: expandedPrompt,
|
22
|
+
},
|
23
|
+
model,
|
24
|
+
options,
|
25
|
+
startStream: async (options) => model.doStreamObject(schema, expandedPrompt, options),
|
26
|
+
processDelta(delta) {
|
27
|
+
const textDelta = model.extractObjectTextDelta(delta.deltaValue);
|
28
|
+
if (textDelta == null) {
|
29
|
+
return undefined;
|
30
|
+
}
|
31
|
+
accumulatedText += textDelta;
|
32
|
+
accumulatedTextDelta += textDelta;
|
33
|
+
const currentObject = model.parseAccumulatedObjectText(accumulatedText);
|
34
|
+
// only send a new part into the stream when the partial object has changed:
|
35
|
+
if (!isDeepEqualData(latestObject, currentObject)) {
|
36
|
+
latestObject = currentObject;
|
37
|
+
// reset delta accumulation:
|
38
|
+
const currentAccumulatedTextDelta = accumulatedTextDelta;
|
39
|
+
accumulatedTextDelta = "";
|
40
|
+
// TODO add type checking
|
41
|
+
return {
|
42
|
+
partialObject: latestObject,
|
43
|
+
partialText: accumulatedText,
|
44
|
+
textDelta: currentAccumulatedTextDelta,
|
45
|
+
};
|
46
|
+
}
|
47
|
+
return undefined;
|
48
|
+
},
|
49
|
+
// The last object is processed and returned, even if it was already returned previously.
|
50
|
+
// The reason is that the full text delta should be returned (and no characters should be omitted).
|
51
|
+
processFinished() {
|
52
|
+
return {
|
53
|
+
partialObject: latestObject,
|
54
|
+
partialText: accumulatedText,
|
55
|
+
textDelta: accumulatedTextDelta,
|
56
|
+
};
|
57
|
+
},
|
58
|
+
onDone() {
|
59
|
+
// process the final result (full type validation):
|
60
|
+
const parseResult = schema.validate(latestObject);
|
61
|
+
if (parseResult.success) {
|
62
|
+
resolveObject(parseResult.value);
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
rejectObject(parseResult.error);
|
66
|
+
}
|
67
|
+
},
|
68
|
+
});
|
69
|
+
return fullResponse
|
70
|
+
? {
|
71
|
+
objectStream: callResponse.value,
|
72
|
+
objectPromise: objectPromise,
|
73
|
+
metadata: callResponse.metadata,
|
74
|
+
}
|
75
|
+
: callResponse.value;
|
76
|
+
}
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PromptTemplateTextGenerationModel = void 0;
|
4
4
|
const TextGenerationToolCallModel_js_1 = require("../../tool/generate-tool-call/TextGenerationToolCallModel.cjs");
|
5
5
|
const TextGenerationToolCallsModel_js_1 = require("../../tool/generate-tool-calls/TextGenerationToolCallsModel.cjs");
|
6
|
-
const
|
6
|
+
const ObjectFromTextGenerationModel_js_1 = require("../generate-object/ObjectFromTextGenerationModel.cjs");
|
7
7
|
class PromptTemplateTextGenerationModel {
|
8
8
|
constructor({ model, promptTemplate, }) {
|
9
9
|
Object.defineProperty(this, "model", {
|
@@ -62,8 +62,8 @@ class PromptTemplateTextGenerationModel {
|
|
62
62
|
template: promptTemplate,
|
63
63
|
});
|
64
64
|
}
|
65
|
-
|
66
|
-
return new
|
65
|
+
asObjectGenerationModel(promptTemplate) {
|
66
|
+
return new ObjectFromTextGenerationModel_js_1.ObjectFromTextGenerationModel({
|
67
67
|
model: this,
|
68
68
|
template: promptTemplate,
|
69
69
|
});
|
@@ -4,8 +4,8 @@ import { Schema } from "../../core/schema/Schema.js";
|
|
4
4
|
import { TextGenerationToolCallModel, ToolCallPromptTemplate } from "../../tool/generate-tool-call/TextGenerationToolCallModel.js";
|
5
5
|
import { TextGenerationToolCallsModel } from "../../tool/generate-tool-calls/TextGenerationToolCallsModel.js";
|
6
6
|
import { ToolCallsPromptTemplate } from "../../tool/generate-tool-calls/ToolCallsPromptTemplate.js";
|
7
|
-
import {
|
8
|
-
import {
|
7
|
+
import { ObjectFromTextGenerationModel } from "../generate-object/ObjectFromTextGenerationModel.js";
|
8
|
+
import { ObjectFromTextPromptTemplate } from "../generate-object/ObjectFromTextPromptTemplate.js";
|
9
9
|
import { TextGenerationModel, TextGenerationModelSettings } from "./TextGenerationModel.js";
|
10
10
|
import { TextGenerationPromptTemplate } from "./TextGenerationPromptTemplate.js";
|
11
11
|
export declare class PromptTemplateTextGenerationModel<PROMPT, MODEL_PROMPT, SETTINGS extends TextGenerationModelSettings, MODEL extends TextGenerationModel<MODEL_PROMPT, SETTINGS>> implements TextGenerationModel<PROMPT, SETTINGS> {
|
@@ -41,7 +41,7 @@ export declare class PromptTemplateTextGenerationModel<PROMPT, MODEL_PROMPT, SET
|
|
41
41
|
get settingsForEvent(): Partial<SETTINGS>;
|
42
42
|
asToolCallGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallPromptTemplate<INPUT_PROMPT, PROMPT>): TextGenerationToolCallModel<INPUT_PROMPT, PROMPT, this>;
|
43
43
|
asToolCallsOrTextGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallsPromptTemplate<INPUT_PROMPT, PROMPT>): TextGenerationToolCallsModel<INPUT_PROMPT, PROMPT, this>;
|
44
|
-
|
44
|
+
asObjectGenerationModel<INPUT_PROMPT>(promptTemplate: ObjectFromTextPromptTemplate<INPUT_PROMPT, PROMPT>): ObjectFromTextGenerationModel<INPUT_PROMPT, PROMPT, this>;
|
45
45
|
withJsonOutput(schema: Schema<unknown> & JsonSchemaProducer): this;
|
46
46
|
withSettings(additionalSettings: Partial<SETTINGS>): this;
|
47
47
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { TextGenerationToolCallModel, } from "../../tool/generate-tool-call/TextGenerationToolCallModel.js";
|
2
2
|
import { TextGenerationToolCallsModel } from "../../tool/generate-tool-calls/TextGenerationToolCallsModel.js";
|
3
|
-
import {
|
3
|
+
import { ObjectFromTextGenerationModel } from "../generate-object/ObjectFromTextGenerationModel.js";
|
4
4
|
export class PromptTemplateTextGenerationModel {
|
5
5
|
constructor({ model, promptTemplate, }) {
|
6
6
|
Object.defineProperty(this, "model", {
|
@@ -59,8 +59,8 @@ export class PromptTemplateTextGenerationModel {
|
|
59
59
|
template: promptTemplate,
|
60
60
|
});
|
61
61
|
}
|
62
|
-
|
63
|
-
return new
|
62
|
+
asObjectGenerationModel(promptTemplate) {
|
63
|
+
return new ObjectFromTextGenerationModel({
|
64
64
|
model: this,
|
65
65
|
template: promptTemplate,
|
66
66
|
});
|