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.
Files changed (37) hide show
  1. package/README.md +4 -4
  2. package/model-function/ModelCallEvent.d.ts +3 -2
  3. package/model-function/generate-tool-call/NoSuchToolDefinitionError.cjs +41 -0
  4. package/model-function/generate-tool-call/NoSuchToolDefinitionError.d.ts +17 -0
  5. package/model-function/generate-tool-call/NoSuchToolDefinitionError.js +37 -0
  6. package/model-function/generate-tool-call/ToolCall.d.ts +5 -0
  7. package/model-function/generate-tool-call/ToolCallGenerationModel.d.ts +3 -3
  8. package/model-function/generate-tool-call/ToolCallParametersValidationError.cjs +1 -1
  9. package/model-function/generate-tool-call/ToolCallParametersValidationError.js +1 -1
  10. package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.cjs +2 -0
  11. package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.d.ts +23 -0
  12. package/model-function/generate-tool-call/ToolCallsOrTextGenerationEvent.js +1 -0
  13. package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.cjs +2 -0
  14. package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.d.ts +21 -0
  15. package/model-function/generate-tool-call/ToolCallsOrTextGenerationModel.js +1 -0
  16. package/model-function/generate-tool-call/ToolDefinition.cjs +2 -0
  17. package/model-function/generate-tool-call/{ToolCallDefinition.d.ts → ToolDefinition.d.ts} +1 -1
  18. package/model-function/generate-tool-call/ToolDefinition.js +1 -0
  19. package/model-function/generate-tool-call/generateToolCall.cjs +2 -1
  20. package/model-function/generate-tool-call/generateToolCall.d.ts +6 -11
  21. package/model-function/generate-tool-call/generateToolCall.js +2 -1
  22. package/model-function/generate-tool-call/generateToolCallsOrText.cjs +63 -0
  23. package/model-function/generate-tool-call/generateToolCallsOrText.d.ts +33 -0
  24. package/model-function/generate-tool-call/generateToolCallsOrText.js +59 -0
  25. package/model-function/generate-tool-call/index.cjs +7 -2
  26. package/model-function/generate-tool-call/index.d.ts +7 -2
  27. package/model-function/generate-tool-call/index.js +7 -2
  28. package/model-provider/openai/chat/OpenAIChatMessage.d.ts +4 -1
  29. package/model-provider/openai/chat/OpenAIChatModel.cjs +27 -1
  30. package/model-provider/openai/chat/OpenAIChatModel.d.ts +51 -4
  31. package/model-provider/openai/chat/OpenAIChatModel.js +27 -1
  32. package/package.json +2 -2
  33. package/tool/Tool.cjs +1 -1
  34. package/tool/Tool.d.ts +1 -1
  35. package/tool/Tool.js +1 -1
  36. /package/model-function/generate-tool-call/{ToolCallDefinition.cjs → ToolCall.cjs} +0 -0
  37. /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), [Anthropic](https://modelfusion.dev/integration/model-provider/anthropic), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [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)
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), [Anthropic](https://modelfusion.dev/integration/model-provider/anthropic), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp), [Ollama](https://modelfusion.dev/integration/model-provider/ollama)
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), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [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)
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), [Cohere](https://modelfusion.dev/integration/model-provider/cohere), [Llama.cpp](https://modelfusion.dev/integration/model-provider/llamacpp)
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
+ }
@@ -0,0 +1,5 @@
1
+ export interface ToolCall<NAME extends string, PARAMETERS> {
2
+ id: string;
3
+ name: NAME;
4
+ parameters: PARAMETERS;
5
+ }
@@ -1,12 +1,12 @@
1
1
  import { FunctionOptions } from "../../core/FunctionOptions.js";
2
2
  import { Model, ModelSettings } from "../Model.js";
3
- import { ToolCallDefinition } from "./ToolCallDefinition.js";
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: ToolCallDefinition<string, unknown>, prompt: PROMPT, options?: FunctionOptions): PromiseLike<{
7
+ doGenerateToolCall(tool: ToolDefinition<string, unknown>, prompt: PROMPT, options?: FunctionOptions): PromiseLike<{
8
8
  response: unknown;
9
- value: {
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
- `Value: ${JSON.stringify(parameters)}.\n` +
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
- `Value: ${JSON.stringify(parameters)}.\n` +
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: 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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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 ToolCallDefinition<NAME extends string, PARAMETERS> {
3
+ export interface ToolDefinition<NAME extends string, PARAMETERS> {
4
4
  name: NAME;
5
5
  description?: string;
6
6
  parameters: Schema<PARAMETERS> & JsonSchemaProducer;
@@ -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.value;
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 { ToolCallDefinition } from "./ToolCallDefinition.js";
3
+ import { ToolDefinition } from "./ToolDefinition.js";
4
4
  import { ToolCallGenerationModel, ToolCallGenerationModelSettings } from "./ToolCallGenerationModel.js";
5
- 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 & {
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
- id: string;
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.value;
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("./ToolCallDefinition.cjs"), exports);
18
- __exportStar(require("./ToolCallParametersValidationError.cjs"), exports);
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 "./ToolCallDefinition.js";
2
- export * from "./ToolCallParametersValidationError.js";
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 "./ToolCallDefinition.js";
2
- export * from "./ToolCallParametersValidationError.js";
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";
@@ -9,7 +9,10 @@ export type OpenAIChatMessage = {
9
9
  text: string;
10
10
  } | {
11
11
  type: "image_url";
12
- image_url: string;
12
+ image_url: string | {
13
+ url: string;
14
+ detail: "low" | "high" | "auto";
15
+ };
13
16
  }>;
14
17
  name?: string;
15
18
  } | {
@@ -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
- value: toolCalls == null || toolCalls.length === 0
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: ToolCallDefinition<string, unknown>, prompt: OpenAIChatMessage[], options?: FunctionOptions): Promise<{
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
- value: {
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
- value: toolCalls == null || toolCalls.length === 0
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": "Build multimodal applications, chatbots, and agents with JavaScript and TypeScript.",
4
- "version": "0.70.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
- * Provdes a structure definition with the name, description and schema of the input.
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
- * Provdes a structure definition with the name, description and schema of the input.
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
- * Provdes a structure definition with the name, description and schema of the input.
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() {