modelfusion 0.70.0 → 0.71.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 +4 -4
- package/model-function/ModelCallEvent.d.ts +3 -2
- package/model-function/generate-tool-call/NoSuchToolDefinitionError.cjs +41 -0
- package/model-function/generate-tool-call/NoSuchToolDefinitionError.d.ts +17 -0
- package/model-function/generate-tool-call/NoSuchToolDefinitionError.js +37 -0
- package/model-function/generate-tool-call/ToolCall.d.ts +5 -0
- package/model-function/generate-tool-call/ToolCallGenerationModel.d.ts +3 -3
- package/model-function/generate-tool-call/ToolCallParametersValidationError.cjs +1 -1
- package/model-function/generate-tool-call/ToolCallParametersValidationError.js +1 -1
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.cjs +2 -0
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.d.ts +23 -0
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.js +1 -0
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.cjs +2 -0
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.d.ts +21 -0
- package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.js +1 -0
- package/model-function/generate-tool-call/ToolDefinition.cjs +2 -0
- package/model-function/generate-tool-call/{ToolCallDefinition.d.ts → ToolDefinition.d.ts} +1 -1
- package/model-function/generate-tool-call/ToolDefinition.js +1 -0
- package/model-function/generate-tool-call/generateToolCall.cjs +2 -1
- package/model-function/generate-tool-call/generateToolCall.d.ts +6 -11
- package/model-function/generate-tool-call/generateToolCall.js +2 -1
- package/model-function/generate-tool-call/generateToolCallsOrText.cjs +63 -0
- package/model-function/generate-tool-call/generateToolCallsOrText.d.ts +33 -0
- package/model-function/generate-tool-call/generateToolCallsOrText.js +59 -0
- package/model-function/generate-tool-call/index.cjs +7 -2
- package/model-function/generate-tool-call/index.d.ts +7 -2
- package/model-function/generate-tool-call/index.js +7 -2
- package/model-provider/openai/chat/OpenAIChatMessage.d.ts +4 -1
- package/model-provider/openai/chat/OpenAIChatModel.cjs +27 -1
- package/model-provider/openai/chat/OpenAIChatModel.d.ts +51 -4
- package/model-provider/openai/chat/OpenAIChatModel.js +27 -1
- package/package.json +2 -2
- package/tool/Tool.cjs +1 -1
- package/tool/Tool.d.ts +1 -1
- package/tool/Tool.js +1 -1
- /package/model-function/generate-tool-call/{ToolCallDefinition.cjs → ToolCall.cjs} +0 -0
- /package/model-function/generate-tool-call/{ToolCallDefinition.js → ToolCall.js} +0 -0
package/README.md
CHANGED
@@ -52,7 +52,7 @@ const text = await generateText(
|
|
52
52
|
);
|
53
53
|
```
|
54
54
|
|
55
|
-
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [
|
55
|
+
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp), [Ollama](https://modelfusion.dev/integration/model-provider/ollama), [Hugging Face](https://modelfusion.dev/integration/model-provider/huggingface), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [Anthropic](https://modelfusion.dev/integration/model-provider/anthropic)
|
56
56
|
|
57
57
|
#### streamText
|
58
58
|
|
@@ -67,7 +67,7 @@ for await (const textPart of textStream) {
|
|
67
67
|
}
|
68
68
|
```
|
69
69
|
|
70
|
-
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [
|
70
|
+
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp), [Ollama](https://modelfusion.dev/integration/model-provider/ollama), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [Anthropic](https://modelfusion.dev/integration/model-provider/anthropic)
|
71
71
|
|
72
72
|
#### streamText with multi-modal prompt
|
73
73
|
|
@@ -304,7 +304,7 @@ const embeddings = await embedMany(
|
|
304
304
|
);
|
305
305
|
```
|
306
306
|
|
307
|
-
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [
|
307
|
+
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp), [Ollama](https://modelfusion.dev/integration/model-provider/ollama), [Hugging Face](https://modelfusion.dev/integration/model-provider/huggingface), [Cohere](https://modelfusion.dev/integration/model-provider/cohere)
|
308
308
|
|
309
309
|
### [Tokenize Text](https://modelfusion.dev/guide/function/tokenize-text)
|
310
310
|
|
@@ -322,7 +322,7 @@ const tokensAndTokenTexts = await tokenizer.tokenizeWithTexts(text);
|
|
322
322
|
const reconstructedText = await tokenizer.detokenize(tokens);
|
323
323
|
```
|
324
324
|
|
325
|
-
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [
|
325
|
+
Providers: [OpenAI](https://modelfusion.dev/integration/model-provider/openai), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp), [Cohere](https://modelfusion.dev/integration/model-provider/cohere)
|
326
326
|
|
327
327
|
### [Guards](https://modelfusion.dev/guide/guard)
|
328
328
|
|
@@ -7,6 +7,7 @@ import { StructureGenerationFinishedEvent, StructureGenerationStartedEvent } fro
|
|
7
7
|
import { StructureStreamingFinishedEvent, StructureStreamingStartedEvent } from "./generate-structure/StructureStreamingEvent.js";
|
8
8
|
import { TextGenerationFinishedEvent, TextGenerationStartedEvent, TextStreamingFinishedEvent, TextStreamingStartedEvent } from "./generate-text/TextGenerationEvent.js";
|
9
9
|
import { ToolCallGenerationFinishedEvent, ToolCallGenerationStartedEvent } from "./generate-tool-call/ToolCallGenerationEvent.js";
|
10
|
+
import { ToolCallsOrTextGenerationFinishedEvent, ToolCallsOrTextGenerationStartedEvent } from "./generate-tool-call/ToolCallsOrTextGenerationEvent.js";
|
10
11
|
import { TranscriptionFinishedEvent, TranscriptionStartedEvent } from "./generate-transcription/TranscriptionEvent.js";
|
11
12
|
export interface BaseModelCallStartedEvent extends BaseFunctionStartedEvent {
|
12
13
|
model: ModelInformation;
|
@@ -48,5 +49,5 @@ export interface BaseModelCallFinishedEvent extends BaseFunctionFinishedEvent {
|
|
48
49
|
*/
|
49
50
|
result: BaseModelCallFinishedEventResult;
|
50
51
|
}
|
51
|
-
export type ModelCallStartedEvent = EmbeddingStartedEvent | ImageGenerationStartedEvent | SpeechGenerationStartedEvent | SpeechStreamingStartedEvent | StructureGenerationStartedEvent | StructureStreamingStartedEvent | TextGenerationStartedEvent | TextStreamingStartedEvent | ToolCallGenerationStartedEvent | TranscriptionStartedEvent;
|
52
|
-
export type ModelCallFinishedEvent = EmbeddingFinishedEvent | ImageGenerationFinishedEvent | SpeechGenerationFinishedEvent | SpeechStreamingFinishedEvent | StructureGenerationFinishedEvent | StructureStreamingFinishedEvent | TextGenerationFinishedEvent | TextStreamingFinishedEvent | ToolCallGenerationFinishedEvent | TranscriptionFinishedEvent;
|
52
|
+
export type ModelCallStartedEvent = EmbeddingStartedEvent | ImageGenerationStartedEvent | SpeechGenerationStartedEvent | SpeechStreamingStartedEvent | StructureGenerationStartedEvent | StructureStreamingStartedEvent | TextGenerationStartedEvent | TextStreamingStartedEvent | ToolCallGenerationStartedEvent | ToolCallsOrTextGenerationStartedEvent | TranscriptionStartedEvent;
|
53
|
+
export type ModelCallFinishedEvent = EmbeddingFinishedEvent | ImageGenerationFinishedEvent | SpeechGenerationFinishedEvent | SpeechStreamingFinishedEvent | StructureGenerationFinishedEvent | StructureStreamingFinishedEvent | TextGenerationFinishedEvent | TextStreamingFinishedEvent | ToolCallGenerationFinishedEvent | ToolCallsOrTextGenerationFinishedEvent | TranscriptionFinishedEvent;
|
@@ -0,0 +1,41 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.NoSuchToolDefinitionError = void 0;
|
4
|
+
class NoSuchToolDefinitionError extends Error {
|
5
|
+
constructor({ toolName, parameters, }) {
|
6
|
+
super(`Tool definition '${toolName}' not found. ` +
|
7
|
+
`Parameters: ${JSON.stringify(parameters)}.`);
|
8
|
+
Object.defineProperty(this, "toolName", {
|
9
|
+
enumerable: true,
|
10
|
+
configurable: true,
|
11
|
+
writable: true,
|
12
|
+
value: void 0
|
13
|
+
});
|
14
|
+
Object.defineProperty(this, "cause", {
|
15
|
+
enumerable: true,
|
16
|
+
configurable: true,
|
17
|
+
writable: true,
|
18
|
+
value: void 0
|
19
|
+
});
|
20
|
+
Object.defineProperty(this, "parameters", {
|
21
|
+
enumerable: true,
|
22
|
+
configurable: true,
|
23
|
+
writable: true,
|
24
|
+
value: void 0
|
25
|
+
});
|
26
|
+
this.name = "NoSuchToolDefinitionError";
|
27
|
+
this.toolName = toolName;
|
28
|
+
this.parameters = parameters;
|
29
|
+
}
|
30
|
+
toJSON() {
|
31
|
+
return {
|
32
|
+
name: this.name,
|
33
|
+
message: this.message,
|
34
|
+
cause: this.cause,
|
35
|
+
stack: this.stack,
|
36
|
+
toolName: this.toolName,
|
37
|
+
parameter: this.parameters,
|
38
|
+
};
|
39
|
+
}
|
40
|
+
}
|
41
|
+
exports.NoSuchToolDefinitionError = NoSuchToolDefinitionError;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
export declare class NoSuchToolDefinitionError extends Error {
|
2
|
+
readonly toolName: string;
|
3
|
+
readonly cause: unknown;
|
4
|
+
readonly parameters: unknown;
|
5
|
+
constructor({ toolName, parameters, }: {
|
6
|
+
toolName: string;
|
7
|
+
parameters: unknown;
|
8
|
+
});
|
9
|
+
toJSON(): {
|
10
|
+
name: string;
|
11
|
+
message: string;
|
12
|
+
cause: unknown;
|
13
|
+
stack: string | undefined;
|
14
|
+
toolName: string;
|
15
|
+
parameter: unknown;
|
16
|
+
};
|
17
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
export class NoSuchToolDefinitionError extends Error {
|
2
|
+
constructor({ toolName, parameters, }) {
|
3
|
+
super(`Tool definition '${toolName}' not found. ` +
|
4
|
+
`Parameters: ${JSON.stringify(parameters)}.`);
|
5
|
+
Object.defineProperty(this, "toolName", {
|
6
|
+
enumerable: true,
|
7
|
+
configurable: true,
|
8
|
+
writable: true,
|
9
|
+
value: void 0
|
10
|
+
});
|
11
|
+
Object.defineProperty(this, "cause", {
|
12
|
+
enumerable: true,
|
13
|
+
configurable: true,
|
14
|
+
writable: true,
|
15
|
+
value: void 0
|
16
|
+
});
|
17
|
+
Object.defineProperty(this, "parameters", {
|
18
|
+
enumerable: true,
|
19
|
+
configurable: true,
|
20
|
+
writable: true,
|
21
|
+
value: void 0
|
22
|
+
});
|
23
|
+
this.name = "NoSuchToolDefinitionError";
|
24
|
+
this.toolName = toolName;
|
25
|
+
this.parameters = parameters;
|
26
|
+
}
|
27
|
+
toJSON() {
|
28
|
+
return {
|
29
|
+
name: this.name,
|
30
|
+
message: this.message,
|
31
|
+
cause: this.cause,
|
32
|
+
stack: this.stack,
|
33
|
+
toolName: this.toolName,
|
34
|
+
parameter: this.parameters,
|
35
|
+
};
|
36
|
+
}
|
37
|
+
}
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
2
|
import { Model, ModelSettings } from "../Model.js";
|
3
|
-
import {
|
3
|
+
import { ToolDefinition } from "./ToolDefinition.js";
|
4
4
|
export interface ToolCallGenerationModelSettings extends ModelSettings {
|
5
5
|
}
|
6
6
|
export interface ToolCallGenerationModel<PROMPT, SETTINGS extends ToolCallGenerationModelSettings = ToolCallGenerationModelSettings> extends Model<SETTINGS> {
|
7
|
-
doGenerateToolCall(tool:
|
7
|
+
doGenerateToolCall(tool: ToolDefinition<string, unknown>, prompt: PROMPT, options?: FunctionOptions): PromiseLike<{
|
8
8
|
response: unknown;
|
9
|
-
|
9
|
+
toolCall: {
|
10
10
|
id: string;
|
11
11
|
parameters: unknown;
|
12
12
|
} | null;
|
@@ -5,7 +5,7 @@ const getErrorMessage_js_1 = require("../../util/getErrorMessage.cjs");
|
|
5
5
|
class ToolCallParametersValidationError extends Error {
|
6
6
|
constructor({ toolName, parameters, cause, }) {
|
7
7
|
super(`Parameter validation failed for tool '${toolName}'. ` +
|
8
|
-
`
|
8
|
+
`Parameters: ${JSON.stringify(parameters)}.\n` +
|
9
9
|
`Error message: ${(0, getErrorMessage_js_1.getErrorMessage)(cause)}`);
|
10
10
|
Object.defineProperty(this, "toolName", {
|
11
11
|
enumerable: true,
|
@@ -2,7 +2,7 @@ import { getErrorMessage } from "../../util/getErrorMessage.js";
|
|
2
2
|
export class ToolCallParametersValidationError extends Error {
|
3
3
|
constructor({ toolName, parameters, cause, }) {
|
4
4
|
super(`Parameter validation failed for tool '${toolName}'. ` +
|
5
|
-
`
|
5
|
+
`Parameters: ${JSON.stringify(parameters)}.\n` +
|
6
6
|
`Error message: ${getErrorMessage(cause)}`);
|
7
7
|
Object.defineProperty(this, "toolName", {
|
8
8
|
enumerable: true,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import { BaseModelCallFinishedEvent, BaseModelCallStartedEvent } from "../ModelCallEvent.js";
|
2
|
+
export interface ToolCallsOrTextGenerationStartedEvent extends BaseModelCallStartedEvent {
|
3
|
+
functionType: "generate-tool-calls-or-text";
|
4
|
+
}
|
5
|
+
export type ToolCallsOrTextGenerationFinishedEventResult = {
|
6
|
+
status: "success";
|
7
|
+
response: unknown;
|
8
|
+
value: unknown;
|
9
|
+
usage?: {
|
10
|
+
promptTokens: number;
|
11
|
+
completionTokens: number;
|
12
|
+
totalTokens: number;
|
13
|
+
};
|
14
|
+
} | {
|
15
|
+
status: "error";
|
16
|
+
error: unknown;
|
17
|
+
} | {
|
18
|
+
status: "abort";
|
19
|
+
};
|
20
|
+
export type ToolCallsOrTextGenerationFinishedEvent = BaseModelCallFinishedEvent & {
|
21
|
+
functionType: "generate-tool-calls-or-text";
|
22
|
+
result: ToolCallsOrTextGenerationFinishedEventResult;
|
23
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
|
+
import { Model, ModelSettings } from "../Model.js";
|
3
|
+
import { ToolDefinition } from "./ToolDefinition.js";
|
4
|
+
export interface ToolCallsOrTextGenerationModelSettings extends ModelSettings {
|
5
|
+
}
|
6
|
+
export interface ToolCallsOrTextGenerationModel<PROMPT, SETTINGS extends ToolCallsOrTextGenerationModelSettings> extends Model<SETTINGS> {
|
7
|
+
doGenerateToolCallsOrText(tools: Array<ToolDefinition<string, unknown>>, prompt: PROMPT, options?: FunctionOptions): PromiseLike<{
|
8
|
+
response: unknown;
|
9
|
+
text: string | null;
|
10
|
+
toolCalls: Array<{
|
11
|
+
id: string;
|
12
|
+
name: string;
|
13
|
+
parameters: unknown;
|
14
|
+
}> | null;
|
15
|
+
usage?: {
|
16
|
+
promptTokens: number;
|
17
|
+
completionTokens: number;
|
18
|
+
totalTokens: number;
|
19
|
+
};
|
20
|
+
}>;
|
21
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { JsonSchemaProducer } from "../../core/schema/JsonSchemaProducer.js";
|
2
2
|
import { Schema } from "../../core/schema/Schema.js";
|
3
|
-
export interface
|
3
|
+
export interface ToolDefinition<NAME extends string, PARAMETERS> {
|
4
4
|
name: NAME;
|
5
5
|
description?: string;
|
6
6
|
parameters: Schema<PARAMETERS> & JsonSchemaProducer;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -17,7 +17,7 @@ async function generateToolCall(model, tool, prompt, options) {
|
|
17
17
|
generateResponse: async (options) => {
|
18
18
|
try {
|
19
19
|
const result = await model.doGenerateToolCall(tool, expandedPrompt, options);
|
20
|
-
const toolCall = result.
|
20
|
+
const toolCall = result.toolCall;
|
21
21
|
if (toolCall === null) {
|
22
22
|
throw new ToolCallGenerationError_js_1.ToolCallsGenerationError({
|
23
23
|
toolName: tool.name,
|
@@ -36,6 +36,7 @@ async function generateToolCall(model, tool, prompt, options) {
|
|
36
36
|
response: result.response,
|
37
37
|
extractedValue: {
|
38
38
|
id: toolCall.id,
|
39
|
+
name: tool.name,
|
39
40
|
parameters: parseResult.data,
|
40
41
|
},
|
41
42
|
usage: result.usage,
|
@@ -1,20 +1,15 @@
|
|
1
1
|
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
2
|
import { ModelCallMetadata } from "../ModelCallMetadata.js";
|
3
|
-
import {
|
3
|
+
import { ToolDefinition } from "./ToolDefinition.js";
|
4
4
|
import { ToolCallGenerationModel, ToolCallGenerationModelSettings } from "./ToolCallGenerationModel.js";
|
5
|
-
|
5
|
+
import { ToolCall } from "./ToolCall.js";
|
6
|
+
export declare function generateToolCall<PARAMETERS, PROMPT, NAME extends string, SETTINGS extends ToolCallGenerationModelSettings>(model: ToolCallGenerationModel<PROMPT, SETTINGS>, tool: ToolDefinition<NAME, PARAMETERS>, prompt: PROMPT | ((tool: ToolDefinition<NAME, PARAMETERS>) => PROMPT), options?: FunctionOptions & {
|
6
7
|
returnType?: "structure";
|
7
|
-
}): Promise<
|
8
|
-
|
9
|
-
parameters: PARAMETERS;
|
10
|
-
}>;
|
11
|
-
export declare function generateToolCall<PARAMETERS, PROMPT, NAME extends string, SETTINGS extends ToolCallGenerationModelSettings>(model: ToolCallGenerationModel<PROMPT, SETTINGS>, tool: ToolCallDefinition<NAME, PARAMETERS>, prompt: PROMPT | ((tool: ToolCallDefinition<NAME, PARAMETERS>) => PROMPT), options: FunctionOptions & {
|
8
|
+
}): Promise<ToolCall<NAME, PARAMETERS>>;
|
9
|
+
export declare function generateToolCall<PARAMETERS, PROMPT, NAME extends string, SETTINGS extends ToolCallGenerationModelSettings>(model: ToolCallGenerationModel<PROMPT, SETTINGS>, tool: ToolDefinition<NAME, PARAMETERS>, prompt: PROMPT | ((tool: ToolDefinition<NAME, PARAMETERS>) => PROMPT), options: FunctionOptions & {
|
12
10
|
returnType: "full";
|
13
11
|
}): Promise<{
|
14
|
-
value:
|
15
|
-
id: string;
|
16
|
-
parameters: PARAMETERS;
|
17
|
-
};
|
12
|
+
value: ToolCall<NAME, PARAMETERS>;
|
18
13
|
response: unknown;
|
19
14
|
metadata: ModelCallMetadata;
|
20
15
|
}>;
|
@@ -14,7 +14,7 @@ export async function generateToolCall(model, tool, prompt, options) {
|
|
14
14
|
generateResponse: async (options) => {
|
15
15
|
try {
|
16
16
|
const result = await model.doGenerateToolCall(tool, expandedPrompt, options);
|
17
|
-
const toolCall = result.
|
17
|
+
const toolCall = result.toolCall;
|
18
18
|
if (toolCall === null) {
|
19
19
|
throw new ToolCallsGenerationError({
|
20
20
|
toolName: tool.name,
|
@@ -33,6 +33,7 @@ export async function generateToolCall(model, tool, prompt, options) {
|
|
33
33
|
response: result.response,
|
34
34
|
extractedValue: {
|
35
35
|
id: toolCall.id,
|
36
|
+
name: tool.name,
|
36
37
|
parameters: parseResult.data,
|
37
38
|
},
|
38
39
|
usage: result.usage,
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.generateToolCallsOrText = void 0;
|
4
|
+
const executeStandardCall_js_1 = require("../executeStandardCall.cjs");
|
5
|
+
const NoSuchToolDefinitionError_js_1 = require("./NoSuchToolDefinitionError.cjs");
|
6
|
+
const ToolCallParametersValidationError_js_1 = require("./ToolCallParametersValidationError.cjs");
|
7
|
+
async function generateToolCallsOrText(model, tools, prompt, options) {
|
8
|
+
// Note: PROMPT must not be a function.
|
9
|
+
const expandedPrompt = typeof prompt === "function"
|
10
|
+
? prompt(tools)
|
11
|
+
: prompt;
|
12
|
+
const fullResponse = await (0, executeStandardCall_js_1.executeStandardCall)({
|
13
|
+
functionType: "generate-tool-calls-or-text",
|
14
|
+
input: expandedPrompt,
|
15
|
+
model,
|
16
|
+
options,
|
17
|
+
generateResponse: async (options) => {
|
18
|
+
const result = await model.doGenerateToolCallsOrText(tools, expandedPrompt, options);
|
19
|
+
const { text, toolCalls: rawToolCalls } = result;
|
20
|
+
// no tool calls:
|
21
|
+
if (rawToolCalls == null) {
|
22
|
+
return {
|
23
|
+
response: result.response,
|
24
|
+
extractedValue: { text, toolCalls: null },
|
25
|
+
usage: result.usage,
|
26
|
+
};
|
27
|
+
}
|
28
|
+
// map tool calls:
|
29
|
+
const toolCalls = rawToolCalls.map((rawToolCall) => {
|
30
|
+
const tool = tools.find((tool) => tool.name === rawToolCall.name);
|
31
|
+
if (tool == undefined) {
|
32
|
+
throw new NoSuchToolDefinitionError_js_1.NoSuchToolDefinitionError({
|
33
|
+
toolName: rawToolCall.name,
|
34
|
+
parameters: rawToolCall.parameters,
|
35
|
+
});
|
36
|
+
}
|
37
|
+
const parseResult = tool.parameters.validate(rawToolCall.parameters);
|
38
|
+
if (!parseResult.success) {
|
39
|
+
throw new ToolCallParametersValidationError_js_1.ToolCallParametersValidationError({
|
40
|
+
toolName: tool.name,
|
41
|
+
parameters: rawToolCall.parameters,
|
42
|
+
cause: parseResult.error,
|
43
|
+
});
|
44
|
+
}
|
45
|
+
return {
|
46
|
+
id: rawToolCall.id,
|
47
|
+
name: tool.name,
|
48
|
+
parameters: parseResult.data,
|
49
|
+
};
|
50
|
+
});
|
51
|
+
return {
|
52
|
+
response: result.response,
|
53
|
+
extractedValue: {
|
54
|
+
text,
|
55
|
+
toolCalls: toolCalls,
|
56
|
+
},
|
57
|
+
usage: result.usage,
|
58
|
+
};
|
59
|
+
},
|
60
|
+
});
|
61
|
+
return options?.returnType === "full" ? fullResponse : fullResponse.value;
|
62
|
+
}
|
63
|
+
exports.generateToolCallsOrText = generateToolCallsOrText;
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { FunctionOptions } from "../../core/FunctionOptions.js";
|
2
|
+
import { ModelCallMetadata } from "../ModelCallMetadata.js";
|
3
|
+
import { ToolCallsOrTextGenerationModel, ToolCallsOrTextGenerationModelSettings } from "./ToolCallsOrTextGenerationModel.js";
|
4
|
+
import { ToolDefinition } from "./ToolDefinition.js";
|
5
|
+
type ToolCallDefinitionArray<T extends ToolDefinition<any, any>[]> = T;
|
6
|
+
type ToToolCallDefinitionMap<T extends ToolCallDefinitionArray<ToolDefinition<any, any>[]>> = {
|
7
|
+
[K in T[number]["name"]]: Extract<T[number], ToolDefinition<K, any>>;
|
8
|
+
};
|
9
|
+
type ToToolCallUnion<T> = {
|
10
|
+
[KEY in keyof T]: T[KEY] extends ToolDefinition<any, infer PARAMETERS> ? {
|
11
|
+
id: string;
|
12
|
+
name: KEY;
|
13
|
+
parameters: PARAMETERS;
|
14
|
+
} : never;
|
15
|
+
}[keyof T];
|
16
|
+
type ToOutputValue<TOOL_CALLS extends ToolCallDefinitionArray<ToolDefinition<any, any>[]>> = ToToolCallUnion<ToToolCallDefinitionMap<TOOL_CALLS>>;
|
17
|
+
export declare function generateToolCallsOrText<TOOLS extends Array<ToolDefinition<any, any>>, PROMPT>(model: ToolCallsOrTextGenerationModel<PROMPT, ToolCallsOrTextGenerationModelSettings>, tools: TOOLS, prompt: PROMPT | ((structureDefinitions: TOOLS) => PROMPT), options?: FunctionOptions & {
|
18
|
+
returnType?: "structure";
|
19
|
+
}): Promise<{
|
20
|
+
text: string | null;
|
21
|
+
toolCalls: Array<ToOutputValue<TOOLS>> | null;
|
22
|
+
}>;
|
23
|
+
export declare function generateToolCallsOrText<TOOLS extends ToolDefinition<any, any>[], PROMPT>(model: ToolCallsOrTextGenerationModel<PROMPT, ToolCallsOrTextGenerationModelSettings>, tools: TOOLS, prompt: PROMPT | ((structureDefinitions: TOOLS) => PROMPT), options: FunctionOptions & {
|
24
|
+
returnType?: "full";
|
25
|
+
}): Promise<{
|
26
|
+
value: {
|
27
|
+
text: string | null;
|
28
|
+
toolCalls: Array<ToOutputValue<TOOLS>>;
|
29
|
+
};
|
30
|
+
response: unknown;
|
31
|
+
metadata: ModelCallMetadata;
|
32
|
+
}>;
|
33
|
+
export {};
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { executeStandardCall } from "../executeStandardCall.js";
|
2
|
+
import { NoSuchToolDefinitionError } from "./NoSuchToolDefinitionError.js";
|
3
|
+
import { ToolCallParametersValidationError } from "./ToolCallParametersValidationError.js";
|
4
|
+
export async function generateToolCallsOrText(model, tools, prompt, options) {
|
5
|
+
// Note: PROMPT must not be a function.
|
6
|
+
const expandedPrompt = typeof prompt === "function"
|
7
|
+
? prompt(tools)
|
8
|
+
: prompt;
|
9
|
+
const fullResponse = await executeStandardCall({
|
10
|
+
functionType: "generate-tool-calls-or-text",
|
11
|
+
input: expandedPrompt,
|
12
|
+
model,
|
13
|
+
options,
|
14
|
+
generateResponse: async (options) => {
|
15
|
+
const result = await model.doGenerateToolCallsOrText(tools, expandedPrompt, options);
|
16
|
+
const { text, toolCalls: rawToolCalls } = result;
|
17
|
+
// no tool calls:
|
18
|
+
if (rawToolCalls == null) {
|
19
|
+
return {
|
20
|
+
response: result.response,
|
21
|
+
extractedValue: { text, toolCalls: null },
|
22
|
+
usage: result.usage,
|
23
|
+
};
|
24
|
+
}
|
25
|
+
// map tool calls:
|
26
|
+
const toolCalls = rawToolCalls.map((rawToolCall) => {
|
27
|
+
const tool = tools.find((tool) => tool.name === rawToolCall.name);
|
28
|
+
if (tool == undefined) {
|
29
|
+
throw new NoSuchToolDefinitionError({
|
30
|
+
toolName: rawToolCall.name,
|
31
|
+
parameters: rawToolCall.parameters,
|
32
|
+
});
|
33
|
+
}
|
34
|
+
const parseResult = tool.parameters.validate(rawToolCall.parameters);
|
35
|
+
if (!parseResult.success) {
|
36
|
+
throw new ToolCallParametersValidationError({
|
37
|
+
toolName: tool.name,
|
38
|
+
parameters: rawToolCall.parameters,
|
39
|
+
cause: parseResult.error,
|
40
|
+
});
|
41
|
+
}
|
42
|
+
return {
|
43
|
+
id: rawToolCall.id,
|
44
|
+
name: tool.name,
|
45
|
+
parameters: parseResult.data,
|
46
|
+
};
|
47
|
+
});
|
48
|
+
return {
|
49
|
+
response: result.response,
|
50
|
+
extractedValue: {
|
51
|
+
text,
|
52
|
+
toolCalls: toolCalls,
|
53
|
+
},
|
54
|
+
usage: result.usage,
|
55
|
+
};
|
56
|
+
},
|
57
|
+
});
|
58
|
+
return options?.returnType === "full" ? fullResponse : fullResponse.value;
|
59
|
+
}
|
@@ -14,8 +14,13 @@ 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("./
|
17
|
+
__exportStar(require("./ToolCall.cjs"), exports);
|
18
|
+
__exportStar(require("./ToolCallGenerationError.cjs"), exports);
|
19
19
|
__exportStar(require("./ToolCallGenerationEvent.cjs"), exports);
|
20
20
|
__exportStar(require("./ToolCallGenerationModel.cjs"), exports);
|
21
|
+
__exportStar(require("./ToolCallParametersValidationError.cjs"), exports);
|
22
|
+
__exportStar(require("./ToolCallsOrTextGenerationEvent.cjs"), exports);
|
23
|
+
__exportStar(require("./ToolCallsOrTextGenerationModel.cjs"), exports);
|
24
|
+
__exportStar(require("./ToolDefinition.cjs"), exports);
|
21
25
|
__exportStar(require("./generateToolCall.cjs"), exports);
|
26
|
+
__exportStar(require("./generateToolCallsOrText.cjs"), exports);
|
@@ -1,5 +1,10 @@
|
|
1
|
-
export * from "./
|
2
|
-
export * from "./
|
1
|
+
export * from "./ToolCall.js";
|
2
|
+
export * from "./ToolCallGenerationError.js";
|
3
3
|
export * from "./ToolCallGenerationEvent.js";
|
4
4
|
export * from "./ToolCallGenerationModel.js";
|
5
|
+
export * from "./ToolCallParametersValidationError.js";
|
6
|
+
export * from "./ToolCallsOrTextGenerationEvent.js";
|
7
|
+
export * from "./ToolCallsOrTextGenerationModel.js";
|
8
|
+
export * from "./ToolDefinition.js";
|
5
9
|
export * from "./generateToolCall.js";
|
10
|
+
export * from "./generateToolCallsOrText.js";
|
@@ -1,5 +1,10 @@
|
|
1
|
-
export * from "./
|
2
|
-
export * from "./
|
1
|
+
export * from "./ToolCall.js";
|
2
|
+
export * from "./ToolCallGenerationError.js";
|
3
3
|
export * from "./ToolCallGenerationEvent.js";
|
4
4
|
export * from "./ToolCallGenerationModel.js";
|
5
|
+
export * from "./ToolCallParametersValidationError.js";
|
6
|
+
export * from "./ToolCallsOrTextGenerationEvent.js";
|
7
|
+
export * from "./ToolCallsOrTextGenerationModel.js";
|
8
|
+
export * from "./ToolDefinition.js";
|
5
9
|
export * from "./generateToolCall.js";
|
10
|
+
export * from "./generateToolCallsOrText.js";
|
@@ -383,7 +383,7 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
383
383
|
const toolCalls = response.choices[0]?.message.tool_calls;
|
384
384
|
return {
|
385
385
|
response,
|
386
|
-
|
386
|
+
toolCall: toolCalls == null || toolCalls.length === 0
|
387
387
|
? null
|
388
388
|
: {
|
389
389
|
id: toolCalls[0].id,
|
@@ -392,6 +392,32 @@ class OpenAIChatModel extends AbstractModel_js_1.AbstractModel {
|
|
392
392
|
usage: this.extractUsage(response),
|
393
393
|
};
|
394
394
|
}
|
395
|
+
async doGenerateToolCallsOrText(tools, prompt, options) {
|
396
|
+
const response = await this.callAPI(prompt, {
|
397
|
+
...options,
|
398
|
+
responseFormat: exports.OpenAIChatResponseFormat.json,
|
399
|
+
toolChoice: "auto",
|
400
|
+
tools: tools.map((tool) => ({
|
401
|
+
type: "function",
|
402
|
+
function: {
|
403
|
+
name: tool.name,
|
404
|
+
description: tool.description,
|
405
|
+
parameters: tool.parameters.getJsonSchema(),
|
406
|
+
},
|
407
|
+
})),
|
408
|
+
});
|
409
|
+
const message = response.choices[0]?.message;
|
410
|
+
return {
|
411
|
+
response,
|
412
|
+
text: message.content ?? null,
|
413
|
+
toolCalls: message.tool_calls?.map((toolCall) => ({
|
414
|
+
id: toolCall.id,
|
415
|
+
name: toolCall.function.name,
|
416
|
+
parameters: (0, parseJSON_js_1.parseJSON)({ text: toolCall.function.arguments }),
|
417
|
+
})) ?? null,
|
418
|
+
usage: this.extractUsage(response),
|
419
|
+
};
|
420
|
+
}
|
395
421
|
extractUsage(response) {
|
396
422
|
return {
|
397
423
|
promptTokens: response.usage.prompt_tokens,
|
@@ -10,8 +10,9 @@ import { StructureOrTextGenerationModel } from "../../../model-function/generate
|
|
10
10
|
import { PromptFormatTextStreamingModel } from "../../../model-function/generate-text/PromptFormatTextStreamingModel.js";
|
11
11
|
import { TextGenerationModelSettings, TextStreamingModel } from "../../../model-function/generate-text/TextGenerationModel.js";
|
12
12
|
import { TextGenerationPromptFormat } from "../../../model-function/generate-text/TextGenerationPromptFormat.js";
|
13
|
-
import { ToolCallDefinition } from "../../../model-function/generate-tool-call/ToolCallDefinition.js";
|
14
13
|
import { ToolCallGenerationModel } from "../../../model-function/generate-tool-call/ToolCallGenerationModel.js";
|
14
|
+
import { ToolCallsOrTextGenerationModel } from "../../../model-function/generate-tool-call/ToolCallsOrTextGenerationModel.js";
|
15
|
+
import { ToolDefinition } from "../../../model-function/generate-tool-call/ToolDefinition.js";
|
15
16
|
import { TikTokenTokenizer } from "../TikTokenTokenizer.js";
|
16
17
|
import { OpenAIChatMessage } from "./OpenAIChatMessage.js";
|
17
18
|
export declare const OPENAI_CHAT_MODELS: {
|
@@ -168,7 +169,7 @@ export interface OpenAIChatSettings extends TextGenerationModelSettings, Omit<Op
|
|
168
169
|
* ),
|
169
170
|
* ]);
|
170
171
|
*/
|
171
|
-
export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> implements TextStreamingModel<OpenAIChatMessage[], OpenAIChatSettings>, StructureGenerationModel<OpenAIChatMessage[], OpenAIChatSettings>, StructureOrTextGenerationModel<OpenAIChatMessage[], OpenAIChatSettings>, ToolCallGenerationModel<OpenAIChatMessage[], OpenAIChatSettings> {
|
172
|
+
export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> implements TextStreamingModel<OpenAIChatMessage[], OpenAIChatSettings>, StructureGenerationModel<OpenAIChatMessage[], OpenAIChatSettings>, StructureOrTextGenerationModel<OpenAIChatMessage[], OpenAIChatSettings>, ToolCallGenerationModel<OpenAIChatMessage[], OpenAIChatSettings>, ToolCallsOrTextGenerationModel<OpenAIChatMessage[], OpenAIChatSettings> {
|
172
173
|
constructor(settings: OpenAIChatSettings);
|
173
174
|
readonly provider: "openai";
|
174
175
|
get modelName(): OpenAIChatModelType;
|
@@ -371,7 +372,7 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
371
372
|
totalTokens: number;
|
372
373
|
};
|
373
374
|
}>;
|
374
|
-
doGenerateToolCall(tool:
|
375
|
+
doGenerateToolCall(tool: ToolDefinition<string, unknown>, prompt: OpenAIChatMessage[], options?: FunctionOptions): Promise<{
|
375
376
|
response: {
|
376
377
|
object: "chat.completion";
|
377
378
|
usage: {
|
@@ -405,7 +406,7 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
405
406
|
created: number;
|
406
407
|
system_fingerprint?: string | undefined;
|
407
408
|
};
|
408
|
-
|
409
|
+
toolCall: {
|
409
410
|
id: string;
|
410
411
|
parameters: unknown;
|
411
412
|
} | null;
|
@@ -415,6 +416,52 @@ export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> i
|
|
415
416
|
totalTokens: number;
|
416
417
|
};
|
417
418
|
}>;
|
419
|
+
doGenerateToolCallsOrText(tools: Array<ToolDefinition<string, unknown>>, prompt: OpenAIChatMessage[], options?: FunctionOptions): Promise<{
|
420
|
+
response: {
|
421
|
+
object: "chat.completion";
|
422
|
+
usage: {
|
423
|
+
prompt_tokens: number;
|
424
|
+
total_tokens: number;
|
425
|
+
completion_tokens: number;
|
426
|
+
};
|
427
|
+
model: string;
|
428
|
+
id: string;
|
429
|
+
choices: {
|
430
|
+
message: {
|
431
|
+
role: "assistant";
|
432
|
+
content: string | null;
|
433
|
+
function_call?: {
|
434
|
+
name: string;
|
435
|
+
arguments: string;
|
436
|
+
} | undefined;
|
437
|
+
tool_calls?: {
|
438
|
+
function: {
|
439
|
+
name: string;
|
440
|
+
arguments: string;
|
441
|
+
};
|
442
|
+
type: "function";
|
443
|
+
id: string;
|
444
|
+
}[] | undefined;
|
445
|
+
};
|
446
|
+
index: number;
|
447
|
+
logprobs?: any;
|
448
|
+
finish_reason?: "length" | "stop" | "function_call" | "tool_calls" | "content_filter" | null | undefined;
|
449
|
+
}[];
|
450
|
+
created: number;
|
451
|
+
system_fingerprint?: string | undefined;
|
452
|
+
};
|
453
|
+
text: string | null;
|
454
|
+
toolCalls: {
|
455
|
+
id: string;
|
456
|
+
name: string;
|
457
|
+
parameters: unknown;
|
458
|
+
}[] | null;
|
459
|
+
usage: {
|
460
|
+
promptTokens: number;
|
461
|
+
completionTokens: number;
|
462
|
+
totalTokens: number;
|
463
|
+
};
|
464
|
+
}>;
|
418
465
|
extractUsage(response: OpenAIChatResponse): {
|
419
466
|
promptTokens: number;
|
420
467
|
completionTokens: number;
|
@@ -374,7 +374,7 @@ export class OpenAIChatModel extends AbstractModel {
|
|
374
374
|
const toolCalls = response.choices[0]?.message.tool_calls;
|
375
375
|
return {
|
376
376
|
response,
|
377
|
-
|
377
|
+
toolCall: toolCalls == null || toolCalls.length === 0
|
378
378
|
? null
|
379
379
|
: {
|
380
380
|
id: toolCalls[0].id,
|
@@ -383,6 +383,32 @@ export class OpenAIChatModel extends AbstractModel {
|
|
383
383
|
usage: this.extractUsage(response),
|
384
384
|
};
|
385
385
|
}
|
386
|
+
async doGenerateToolCallsOrText(tools, prompt, options) {
|
387
|
+
const response = await this.callAPI(prompt, {
|
388
|
+
...options,
|
389
|
+
responseFormat: OpenAIChatResponseFormat.json,
|
390
|
+
toolChoice: "auto",
|
391
|
+
tools: tools.map((tool) => ({
|
392
|
+
type: "function",
|
393
|
+
function: {
|
394
|
+
name: tool.name,
|
395
|
+
description: tool.description,
|
396
|
+
parameters: tool.parameters.getJsonSchema(),
|
397
|
+
},
|
398
|
+
})),
|
399
|
+
});
|
400
|
+
const message = response.choices[0]?.message;
|
401
|
+
return {
|
402
|
+
response,
|
403
|
+
text: message.content ?? null,
|
404
|
+
toolCalls: message.tool_calls?.map((toolCall) => ({
|
405
|
+
id: toolCall.id,
|
406
|
+
name: toolCall.function.name,
|
407
|
+
parameters: parseJSON({ text: toolCall.function.arguments }),
|
408
|
+
})) ?? null,
|
409
|
+
usage: this.extractUsage(response),
|
410
|
+
};
|
411
|
+
}
|
386
412
|
extractUsage(response) {
|
387
413
|
return {
|
388
414
|
promptTokens: response.usage.prompt_tokens,
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "modelfusion",
|
3
|
-
"description": "
|
4
|
-
"version": "0.
|
3
|
+
"description": "The TypeScript library for building multi-modal AI applications.",
|
4
|
+
"version": "0.71.0",
|
5
5
|
"author": "Lars Grammel",
|
6
6
|
"license": "MIT",
|
7
7
|
"keywords": [
|
package/tool/Tool.cjs
CHANGED
@@ -71,7 +71,7 @@ class Tool {
|
|
71
71
|
this.execute = execute;
|
72
72
|
}
|
73
73
|
/**
|
74
|
-
*
|
74
|
+
* Provides a structure definition with the name, description and schema of the input.
|
75
75
|
* This is used by `useTool`.
|
76
76
|
*/
|
77
77
|
get inputStructureDefinition() {
|
package/tool/Tool.d.ts
CHANGED
@@ -38,7 +38,7 @@ export declare class Tool<NAME extends string, INPUT, OUTPUT> {
|
|
38
38
|
execute(input: INPUT, options?: FunctionOptions): PromiseLike<OUTPUT>;
|
39
39
|
});
|
40
40
|
/**
|
41
|
-
*
|
41
|
+
* Provides a structure definition with the name, description and schema of the input.
|
42
42
|
* This is used by `useTool`.
|
43
43
|
*/
|
44
44
|
get inputStructureDefinition(): StructureDefinition<NAME, INPUT>;
|
package/tool/Tool.js
CHANGED
@@ -68,7 +68,7 @@ export class Tool {
|
|
68
68
|
this.execute = execute;
|
69
69
|
}
|
70
70
|
/**
|
71
|
-
*
|
71
|
+
* Provides a structure definition with the name, description and schema of the input.
|
72
72
|
* This is used by `useTool`.
|
73
73
|
*/
|
74
74
|
get inputStructureDefinition() {
|
File without changes
|
File without changes
|