modelfusion 0.71.0 → 0.72.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 (140) hide show
  1. package/README.md +57 -45
  2. package/core/FunctionEvent.d.ts +5 -5
  3. package/guard/guard.cjs +5 -4
  4. package/guard/guard.d.ts +1 -1
  5. package/guard/guard.js +5 -4
  6. package/model-function/ModelCallEvent.d.ts +2 -2
  7. package/model-function/generate-structure/StructureGenerationEvent.d.ts +2 -2
  8. package/model-function/generate-structure/StructureParseError.cjs +10 -0
  9. package/model-function/generate-structure/StructureParseError.d.ts +8 -0
  10. package/model-function/generate-structure/StructureParseError.js +10 -0
  11. package/model-function/generate-structure/index.cjs +0 -3
  12. package/model-function/generate-structure/index.d.ts +0 -3
  13. package/model-function/generate-structure/index.js +0 -3
  14. package/model-function/index.cjs +0 -1
  15. package/model-function/index.d.ts +0 -1
  16. package/model-function/index.js +0 -1
  17. package/model-provider/automatic1111/Automatic1111ImageGenerationModel.d.ts +3 -3
  18. package/model-provider/openai/chat/OpenAIChatMessage.cjs +16 -25
  19. package/model-provider/openai/chat/OpenAIChatMessage.d.ts +10 -28
  20. package/model-provider/openai/chat/OpenAIChatMessage.js +16 -25
  21. package/model-provider/openai/chat/OpenAIChatModel.cjs +2 -48
  22. package/model-provider/openai/chat/OpenAIChatModel.d.ts +15 -107
  23. package/model-provider/openai/chat/OpenAIChatModel.js +2 -48
  24. package/package.json +1 -1
  25. package/tool/Tool.cjs +5 -16
  26. package/tool/Tool.d.ts +9 -14
  27. package/tool/Tool.js +5 -16
  28. package/tool/ToolCall.d.ts +15 -0
  29. package/tool/ToolCallArgumentsValidationError.cjs +49 -0
  30. package/tool/ToolCallArgumentsValidationError.d.ts +23 -0
  31. package/tool/ToolCallArgumentsValidationError.js +45 -0
  32. package/tool/ToolCallError.cjs +34 -0
  33. package/tool/ToolCallError.d.ts +17 -0
  34. package/tool/ToolCallError.js +30 -0
  35. package/{model-function/generate-tool-call → tool}/ToolCallGenerationError.cjs +4 -4
  36. package/{model-function/generate-tool-call → tool}/ToolCallGenerationError.d.ts +1 -1
  37. package/{model-function/generate-tool-call → tool}/ToolCallGenerationError.js +2 -2
  38. package/{model-function/generate-tool-call/ToolCallParametersValidationError.cjs → tool/ToolCallParseError.cjs} +13 -13
  39. package/{model-function/generate-tool-call/ToolCallParametersValidationError.d.ts → tool/ToolCallParseError.d.ts} +6 -6
  40. package/{model-function/generate-tool-call/ToolCallParametersValidationError.js → tool/ToolCallParseError.js} +11 -11
  41. package/tool/ToolCallResult.d.ts +13 -0
  42. package/{model-function/generate-tool-call → tool}/ToolDefinition.d.ts +2 -2
  43. package/tool/ToolExecutionError.cjs +5 -4
  44. package/tool/ToolExecutionError.d.ts +4 -4
  45. package/tool/ToolExecutionError.js +5 -4
  46. package/tool/WebSearchTool.cjs +4 -4
  47. package/tool/WebSearchTool.d.ts +2 -2
  48. package/tool/WebSearchTool.js +4 -4
  49. package/tool/{ExecuteToolEvent.d.ts → execute-tool/ExecuteToolEvent.d.ts} +1 -1
  50. package/tool/{executeTool.cjs → execute-tool/executeTool.cjs} +15 -15
  51. package/tool/{executeTool.d.ts → execute-tool/executeTool.d.ts} +6 -6
  52. package/tool/{executeTool.js → execute-tool/executeTool.js} +15 -15
  53. package/tool/execute-tool/index.cjs +18 -0
  54. package/tool/execute-tool/index.d.ts +2 -0
  55. package/tool/execute-tool/index.js +2 -0
  56. package/tool/execute-tool/safeExecuteToolCall.cjs +34 -0
  57. package/tool/execute-tool/safeExecuteToolCall.d.ts +5 -0
  58. package/tool/execute-tool/safeExecuteToolCall.js +30 -0
  59. package/tool/generate-tool-call/TextGenerationToolCallModel.cjs +59 -0
  60. package/tool/generate-tool-call/TextGenerationToolCallModel.d.ts +35 -0
  61. package/tool/generate-tool-call/TextGenerationToolCallModel.js +55 -0
  62. package/{model-function → tool}/generate-tool-call/ToolCallGenerationEvent.d.ts +1 -1
  63. package/{model-function → tool}/generate-tool-call/ToolCallGenerationModel.d.ts +3 -3
  64. package/{model-function → tool}/generate-tool-call/generateToolCall.cjs +11 -11
  65. package/{model-function → tool}/generate-tool-call/generateToolCall.d.ts +3 -3
  66. package/{model-function → tool}/generate-tool-call/generateToolCall.js +11 -11
  67. package/tool/generate-tool-call/index.cjs +20 -0
  68. package/tool/generate-tool-call/index.d.ts +4 -0
  69. package/tool/generate-tool-call/index.js +4 -0
  70. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationEvent.d.ts +1 -1
  71. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationModel.d.ts +3 -3
  72. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/generateToolCallsOrText.cjs +8 -8
  73. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/generateToolCallsOrText.d.ts +3 -3
  74. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/generateToolCallsOrText.js +8 -8
  75. package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/index.cjs +0 -7
  76. package/tool/generate-tool-calls-or-text/index.d.ts +3 -0
  77. package/tool/generate-tool-calls-or-text/index.js +3 -0
  78. package/tool/index.cjs +12 -7
  79. package/tool/index.d.ts +12 -7
  80. package/tool/index.js +12 -7
  81. package/tool/{UseToolEvent.d.ts → use-tool/UseToolEvent.d.ts} +1 -1
  82. package/tool/use-tool/index.cjs +18 -0
  83. package/tool/use-tool/index.d.ts +2 -0
  84. package/tool/use-tool/index.js +2 -0
  85. package/tool/use-tool/useTool.cjs +30 -0
  86. package/tool/use-tool/useTool.d.ts +16 -0
  87. package/tool/use-tool/useTool.js +26 -0
  88. package/tool/use-tools-or-generate-text/UseToolsOrGenerateTextEvent.d.ts +7 -0
  89. package/tool/use-tools-or-generate-text/index.cjs +18 -0
  90. package/tool/use-tools-or-generate-text/index.d.ts +2 -0
  91. package/tool/use-tools-or-generate-text/index.js +2 -0
  92. package/tool/use-tools-or-generate-text/useToolsOrGenerateText.cjs +48 -0
  93. package/tool/use-tools-or-generate-text/useToolsOrGenerateText.d.ts +18 -0
  94. package/tool/use-tools-or-generate-text/useToolsOrGenerateText.js +44 -0
  95. package/util/getErrorMessage.cjs +3 -0
  96. package/util/getErrorMessage.d.ts +1 -1
  97. package/util/getErrorMessage.js +3 -0
  98. package/model-function/generate-structure/NoSuchStructureError.cjs +0 -17
  99. package/model-function/generate-structure/NoSuchStructureError.d.ts +0 -4
  100. package/model-function/generate-structure/NoSuchStructureError.js +0 -13
  101. package/model-function/generate-structure/StructureOrTextGenerationModel.d.ts +0 -26
  102. package/model-function/generate-structure/generateStructureOrText.cjs +0 -54
  103. package/model-function/generate-structure/generateStructureOrText.d.ts +0 -97
  104. package/model-function/generate-structure/generateStructureOrText.js +0 -50
  105. package/model-function/generate-tool-call/ToolCall.d.ts +0 -5
  106. package/model-function/generate-tool-call/index.d.ts +0 -10
  107. package/model-function/generate-tool-call/index.js +0 -10
  108. package/tool/NoSuchToolError.cjs +0 -25
  109. package/tool/NoSuchToolError.d.ts +0 -10
  110. package/tool/NoSuchToolError.js +0 -21
  111. package/tool/UseToolOrGenerateTextEvent.d.ts +0 -7
  112. package/tool/useTool.cjs +0 -40
  113. package/tool/useTool.d.ts +0 -15
  114. package/tool/useTool.js +0 -36
  115. package/tool/useToolOrGenerateText.cjs +0 -50
  116. package/tool/useToolOrGenerateText.d.ts +0 -23
  117. package/tool/useToolOrGenerateText.js +0 -46
  118. /package/{model-function/generate-tool-call → tool}/NoSuchToolDefinitionError.cjs +0 -0
  119. /package/{model-function/generate-tool-call → tool}/NoSuchToolDefinitionError.d.ts +0 -0
  120. /package/{model-function/generate-tool-call → tool}/NoSuchToolDefinitionError.js +0 -0
  121. /package/{model-function/generate-tool-call → tool}/ToolCall.cjs +0 -0
  122. /package/{model-function/generate-tool-call → tool}/ToolCall.js +0 -0
  123. /package/{model-function/generate-structure/StructureOrTextGenerationModel.cjs → tool/ToolCallResult.cjs} +0 -0
  124. /package/{model-function/generate-structure/StructureOrTextGenerationModel.js → tool/ToolCallResult.js} +0 -0
  125. /package/{model-function/generate-tool-call → tool}/ToolDefinition.cjs +0 -0
  126. /package/{model-function/generate-tool-call → tool}/ToolDefinition.js +0 -0
  127. /package/tool/{ExecuteToolEvent.cjs → execute-tool/ExecuteToolEvent.cjs} +0 -0
  128. /package/tool/{ExecuteToolEvent.js → execute-tool/ExecuteToolEvent.js} +0 -0
  129. /package/{model-function → tool}/generate-tool-call/ToolCallGenerationEvent.cjs +0 -0
  130. /package/{model-function → tool}/generate-tool-call/ToolCallGenerationEvent.js +0 -0
  131. /package/{model-function → tool}/generate-tool-call/ToolCallGenerationModel.cjs +0 -0
  132. /package/{model-function → tool}/generate-tool-call/ToolCallGenerationModel.js +0 -0
  133. /package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationEvent.cjs +0 -0
  134. /package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationEvent.js +0 -0
  135. /package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationModel.cjs +0 -0
  136. /package/{model-function/generate-tool-call → tool/generate-tool-calls-or-text}/ToolCallsOrTextGenerationModel.js +0 -0
  137. /package/tool/{UseToolEvent.cjs → use-tool/UseToolEvent.cjs} +0 -0
  138. /package/tool/{UseToolEvent.js → use-tool/UseToolEvent.js} +0 -0
  139. /package/tool/{UseToolOrGenerateTextEvent.cjs → use-tools-or-generate-text/UseToolsOrGenerateTextEvent.cjs} +0 -0
  140. /package/tool/{UseToolOrGenerateTextEvent.js → use-tools-or-generate-text/UseToolsOrGenerateTextEvent.js} +0 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./UseToolEvent.cjs"), exports);
18
+ __exportStar(require("./useTool.cjs"), exports);
@@ -0,0 +1,2 @@
1
+ export * from "./UseToolEvent.js";
2
+ export * from "./useTool.js";
@@ -0,0 +1,2 @@
1
+ export * from "./UseToolEvent.js";
2
+ export * from "./useTool.js";
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTool = void 0;
4
+ const executeFunctionCall_js_1 = require("../../core/executeFunctionCall.cjs");
5
+ const safeExecuteToolCall_js_1 = require("../execute-tool/safeExecuteToolCall.cjs");
6
+ const generateToolCall_js_1 = require("../generate-tool-call/generateToolCall.cjs");
7
+ /**
8
+ * `useTool` uses `generateToolCall` to generate parameters for a tool and
9
+ * then executes the tool with the parameters using `executeTool`.
10
+ *
11
+ * @returns The result contains the name of the tool (`tool` property),
12
+ * the parameters (`parameters` property, typed),
13
+ * and the result of the tool execution (`result` property, typed).
14
+ *
15
+ * @see {@link generateToolCall}
16
+ * @see {@link executeTool}
17
+ */
18
+ async function useTool(model, tool, prompt, options) {
19
+ // Note: PROMPT must not be a function.
20
+ const expandedPrompt = typeof prompt === "function"
21
+ ? prompt(tool)
22
+ : prompt;
23
+ return (0, executeFunctionCall_js_1.executeFunctionCall)({
24
+ options,
25
+ input: expandedPrompt,
26
+ functionType: "use-tool",
27
+ execute: async (options) => (0, safeExecuteToolCall_js_1.safeExecuteToolCall)(tool, await (0, generateToolCall_js_1.generateToolCall)(model, tool, expandedPrompt, options), options),
28
+ });
29
+ }
30
+ exports.useTool = useTool;
@@ -0,0 +1,16 @@
1
+ import { FunctionOptions } from "../../core/FunctionOptions.js";
2
+ import { Tool } from "../Tool.js";
3
+ import { ToolCallResult } from "../ToolCallResult.js";
4
+ import { ToolCallGenerationModel, ToolCallGenerationModelSettings } from "../generate-tool-call/ToolCallGenerationModel.js";
5
+ /**
6
+ * `useTool` uses `generateToolCall` to generate parameters for a tool and
7
+ * then executes the tool with the parameters using `executeTool`.
8
+ *
9
+ * @returns The result contains the name of the tool (`tool` property),
10
+ * the parameters (`parameters` property, typed),
11
+ * and the result of the tool execution (`result` property, typed).
12
+ *
13
+ * @see {@link generateToolCall}
14
+ * @see {@link executeTool}
15
+ */
16
+ export declare function useTool<PROMPT, TOOL extends Tool<string, any, any>>(model: ToolCallGenerationModel<PROMPT, ToolCallGenerationModelSettings>, tool: TOOL, prompt: PROMPT | ((tool: TOOL) => PROMPT), options?: FunctionOptions): Promise<ToolCallResult<TOOL["name"], TOOL["parameters"], Awaited<ReturnType<TOOL["execute"]>>>>;
@@ -0,0 +1,26 @@
1
+ import { executeFunctionCall } from "../../core/executeFunctionCall.js";
2
+ import { safeExecuteToolCall } from "../execute-tool/safeExecuteToolCall.js";
3
+ import { generateToolCall } from "../generate-tool-call/generateToolCall.js";
4
+ /**
5
+ * `useTool` uses `generateToolCall` to generate parameters for a tool and
6
+ * then executes the tool with the parameters using `executeTool`.
7
+ *
8
+ * @returns The result contains the name of the tool (`tool` property),
9
+ * the parameters (`parameters` property, typed),
10
+ * and the result of the tool execution (`result` property, typed).
11
+ *
12
+ * @see {@link generateToolCall}
13
+ * @see {@link executeTool}
14
+ */
15
+ export async function useTool(model, tool, prompt, options) {
16
+ // Note: PROMPT must not be a function.
17
+ const expandedPrompt = typeof prompt === "function"
18
+ ? prompt(tool)
19
+ : prompt;
20
+ return executeFunctionCall({
21
+ options,
22
+ input: expandedPrompt,
23
+ functionType: "use-tool",
24
+ execute: async (options) => safeExecuteToolCall(tool, await generateToolCall(model, tool, expandedPrompt, options), options),
25
+ });
26
+ }
@@ -0,0 +1,7 @@
1
+ import { BaseFunctionFinishedEvent, BaseFunctionStartedEvent } from "../../core/FunctionEvent.js";
2
+ export interface UseToolsOrGenerateTextStartedEvent extends BaseFunctionStartedEvent {
3
+ functionType: "use-tools-or-generate-text";
4
+ }
5
+ export interface UseToolsOrGenerateTextFinishedEvent extends BaseFunctionFinishedEvent {
6
+ functionType: "use-tools-or-generate-text";
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./UseToolsOrGenerateTextEvent.cjs"), exports);
18
+ __exportStar(require("./useToolsOrGenerateText.cjs"), exports);
@@ -0,0 +1,2 @@
1
+ export * from "./UseToolsOrGenerateTextEvent.js";
2
+ export * from "./useToolsOrGenerateText.js";
@@ -0,0 +1,2 @@
1
+ export * from "./UseToolsOrGenerateTextEvent.js";
2
+ export * from "./useToolsOrGenerateText.js";
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useToolsOrGenerateText = void 0;
4
+ const executeFunctionCall_js_1 = require("../../core/executeFunctionCall.cjs");
5
+ const ToolCallError_js_1 = require("../ToolCallError.cjs");
6
+ const safeExecuteToolCall_js_1 = require("../execute-tool/safeExecuteToolCall.cjs");
7
+ const generateToolCallsOrText_js_1 = require("../generate-tool-calls-or-text/generateToolCallsOrText.cjs");
8
+ async function useToolsOrGenerateText(model, tools, prompt, options) {
9
+ // Note: PROMPT must not be a function.
10
+ const expandedPrompt = typeof prompt === "function"
11
+ ? prompt(tools)
12
+ : prompt;
13
+ return (0, executeFunctionCall_js_1.executeFunctionCall)({
14
+ options,
15
+ input: expandedPrompt,
16
+ functionType: "use-tools-or-generate-text",
17
+ execute: async (options) => {
18
+ const modelResponse = await (0, generateToolCallsOrText_js_1.generateToolCallsOrText)(model, tools, expandedPrompt, { ...options, returnType: "structure" });
19
+ const { toolCalls, text } = modelResponse;
20
+ // no tool calls:
21
+ if (toolCalls == null) {
22
+ return { text, toolResults: null };
23
+ }
24
+ // execute tools in parallel:
25
+ const toolResults = await Promise.all(toolCalls.map(async (toolCall) => {
26
+ const tool = tools.find((tool) => tool.name === toolCall.name);
27
+ if (tool == null) {
28
+ return {
29
+ tool: toolCall.name,
30
+ toolCall,
31
+ args: toolCall.args,
32
+ ok: false,
33
+ result: new ToolCallError_js_1.ToolCallError({
34
+ message: `No tool with name '${toolCall.name}' found.`,
35
+ toolCall,
36
+ }),
37
+ };
38
+ }
39
+ return await (0, safeExecuteToolCall_js_1.safeExecuteToolCall)(tool, toolCall, options);
40
+ }));
41
+ return {
42
+ text,
43
+ toolResults: toolResults,
44
+ };
45
+ },
46
+ });
47
+ }
48
+ exports.useToolsOrGenerateText = useToolsOrGenerateText;
@@ -0,0 +1,18 @@
1
+ import { FunctionOptions } from "../../core/FunctionOptions.js";
2
+ import { Tool } from "../Tool.js";
3
+ import { ToolCallResult } from "../ToolCallResult.js";
4
+ import { ToolCallsOrTextGenerationModel, ToolCallsOrTextGenerationModelSettings } from "../generate-tool-calls-or-text/ToolCallsOrTextGenerationModel.js";
5
+ type ToolArray<T extends Tool<any, any, any>[]> = T;
6
+ type ToToolMap<T extends ToolArray<Tool<any, any, any>[]>> = {
7
+ [K in T[number]["name"]]: Extract<T[number], Tool<K, any, any>>;
8
+ };
9
+ type StringKeys<T> = Extract<keyof T, string>;
10
+ type ToToolCallUnion<T> = {
11
+ [KEY in StringKeys<T>]: T[KEY] extends Tool<any, infer PARAMETERS, infer OUTPUT> ? ToolCallResult<KEY, PARAMETERS, OUTPUT> : never;
12
+ }[StringKeys<T>];
13
+ type ToOutputValue<TOOLS extends ToolArray<Tool<any, any, any>[]>> = ToToolCallUnion<ToToolMap<TOOLS>>;
14
+ export declare function useToolsOrGenerateText<PROMPT, TOOLS extends Array<Tool<any, any, any>>>(model: ToolCallsOrTextGenerationModel<PROMPT, ToolCallsOrTextGenerationModelSettings>, tools: TOOLS, prompt: PROMPT | ((tools: TOOLS) => PROMPT), options?: FunctionOptions): Promise<{
15
+ text: string | null;
16
+ toolResults: Array<ToOutputValue<TOOLS>> | null;
17
+ }>;
18
+ export {};
@@ -0,0 +1,44 @@
1
+ import { executeFunctionCall } from "../../core/executeFunctionCall.js";
2
+ import { ToolCallError } from "../ToolCallError.js";
3
+ import { safeExecuteToolCall } from "../execute-tool/safeExecuteToolCall.js";
4
+ import { generateToolCallsOrText } from "../generate-tool-calls-or-text/generateToolCallsOrText.js";
5
+ export async function useToolsOrGenerateText(model, tools, prompt, options) {
6
+ // Note: PROMPT must not be a function.
7
+ const expandedPrompt = typeof prompt === "function"
8
+ ? prompt(tools)
9
+ : prompt;
10
+ return executeFunctionCall({
11
+ options,
12
+ input: expandedPrompt,
13
+ functionType: "use-tools-or-generate-text",
14
+ execute: async (options) => {
15
+ const modelResponse = await generateToolCallsOrText(model, tools, expandedPrompt, { ...options, returnType: "structure" });
16
+ const { toolCalls, text } = modelResponse;
17
+ // no tool calls:
18
+ if (toolCalls == null) {
19
+ return { text, toolResults: null };
20
+ }
21
+ // execute tools in parallel:
22
+ const toolResults = await Promise.all(toolCalls.map(async (toolCall) => {
23
+ const tool = tools.find((tool) => tool.name === toolCall.name);
24
+ if (tool == null) {
25
+ return {
26
+ tool: toolCall.name,
27
+ toolCall,
28
+ args: toolCall.args,
29
+ ok: false,
30
+ result: new ToolCallError({
31
+ message: `No tool with name '${toolCall.name}' found.`,
32
+ toolCall,
33
+ }),
34
+ };
35
+ }
36
+ return await safeExecuteToolCall(tool, toolCall, options);
37
+ }));
38
+ return {
39
+ text,
40
+ toolResults: toolResults,
41
+ };
42
+ },
43
+ });
44
+ }
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getErrorMessage = void 0;
4
4
  function getErrorMessage(error) {
5
+ if (error == null) {
6
+ return "unknown error";
7
+ }
5
8
  if (typeof error === "string") {
6
9
  return error;
7
10
  }
@@ -1 +1 @@
1
- export declare function getErrorMessage(error: unknown): string;
1
+ export declare function getErrorMessage(error: unknown | undefined): string;
@@ -1,4 +1,7 @@
1
1
  export function getErrorMessage(error) {
2
+ if (error == null) {
3
+ return "unknown error";
4
+ }
2
5
  if (typeof error === "string") {
3
6
  return error;
4
7
  }
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NoSuchStructureError = void 0;
4
- class NoSuchStructureError extends Error {
5
- constructor(structureName) {
6
- super(`No such structure: ${structureName}`);
7
- Object.defineProperty(this, "structureName", {
8
- enumerable: true,
9
- configurable: true,
10
- writable: true,
11
- value: void 0
12
- });
13
- this.name = "NoSuchStructureError";
14
- this.structureName = structureName;
15
- }
16
- }
17
- exports.NoSuchStructureError = NoSuchStructureError;
@@ -1,4 +0,0 @@
1
- export declare class NoSuchStructureError extends Error {
2
- readonly structureName: string;
3
- constructor(structureName: string);
4
- }
@@ -1,13 +0,0 @@
1
- export class NoSuchStructureError extends Error {
2
- constructor(structureName) {
3
- super(`No such structure: ${structureName}`);
4
- Object.defineProperty(this, "structureName", {
5
- enumerable: true,
6
- configurable: true,
7
- writable: true,
8
- value: void 0
9
- });
10
- this.name = "NoSuchStructureError";
11
- this.structureName = structureName;
12
- }
13
- }
@@ -1,26 +0,0 @@
1
- import { FunctionOptions } from "../../core/FunctionOptions.js";
2
- import { StructureDefinition } from "../../core/schema/StructureDefinition.js";
3
- import { Model, ModelSettings } from "../Model.js";
4
- export interface StructureOrTextGenerationModelSettings extends ModelSettings {
5
- }
6
- export interface StructureOrTextGenerationModel<PROMPT, SETTINGS extends StructureOrTextGenerationModelSettings> extends Model<SETTINGS> {
7
- doGenerateStructureOrText(structureDefinitions: Array<StructureDefinition<string, unknown>>, prompt: PROMPT, options?: FunctionOptions): PromiseLike<{
8
- response: unknown;
9
- structureAndText: {
10
- structure: null;
11
- value: null;
12
- valueText: null;
13
- text: string;
14
- } | {
15
- structure: string;
16
- value: unknown;
17
- valueText: string;
18
- text: string | null;
19
- };
20
- usage?: {
21
- promptTokens: number;
22
- completionTokens: number;
23
- totalTokens: number;
24
- };
25
- }>;
26
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateStructureOrText = void 0;
4
- const executeStandardCall_js_1 = require("../executeStandardCall.cjs");
5
- const NoSuchStructureError_js_1 = require("./NoSuchStructureError.cjs");
6
- const StructureValidationError_js_1 = require("./StructureValidationError.cjs");
7
- async function generateStructureOrText(model, structureDefinitions, prompt, options) {
8
- // Note: PROMPT must not be a function.
9
- const expandedPrompt = typeof prompt === "function"
10
- ? prompt(structureDefinitions)
11
- : prompt;
12
- const fullResponse = await (0, executeStandardCall_js_1.executeStandardCall)({
13
- functionType: "generate-structure-or-text",
14
- input: expandedPrompt,
15
- model,
16
- options,
17
- generateResponse: async (options) => {
18
- const result = await model.doGenerateStructureOrText(structureDefinitions, expandedPrompt, options);
19
- const { structure, value, text } = result.structureAndText;
20
- // text generation:
21
- if (structure == null) {
22
- return {
23
- response: result.response,
24
- extractedValue: { structure, value, text },
25
- usage: result.usage,
26
- };
27
- }
28
- const definition = structureDefinitions.find((d) => d.name === structure);
29
- if (definition == undefined) {
30
- throw new NoSuchStructureError_js_1.NoSuchStructureError(structure);
31
- }
32
- const parseResult = definition.schema.validate(value);
33
- if (!parseResult.success) {
34
- throw new StructureValidationError_js_1.StructureValidationError({
35
- structureName: structure,
36
- value,
37
- valueText: result.structureAndText.valueText,
38
- cause: parseResult.error,
39
- });
40
- }
41
- return {
42
- response: result.response,
43
- extractedValue: {
44
- structure: structure,
45
- value: parseResult.data,
46
- text: text, // text is string | null, which is part of the response for schema values
47
- },
48
- usage: result.usage,
49
- };
50
- },
51
- });
52
- return options?.returnType === "full" ? fullResponse : fullResponse.value;
53
- }
54
- exports.generateStructureOrText = generateStructureOrText;
@@ -1,97 +0,0 @@
1
- import { FunctionOptions } from "../../core/FunctionOptions.js";
2
- import { StructureDefinition } from "../../core/schema/StructureDefinition.js";
3
- import { ModelCallMetadata } from "../ModelCallMetadata.js";
4
- import { StructureOrTextGenerationModel, StructureOrTextGenerationModelSettings } from "./StructureOrTextGenerationModel.js";
5
- type StructureDefinitionArray<T extends StructureDefinition<any, any>[]> = T;
6
- type ToStructureDefinitionMap<T extends StructureDefinitionArray<StructureDefinition<any, any>[]>> = {
7
- [K in T[number]["name"]]: Extract<T[number], StructureDefinition<K, any>>;
8
- };
9
- type ToStructureUnion<T> = {
10
- [KEY in keyof T]: T[KEY] extends StructureDefinition<any, infer STRUCTURE> ? {
11
- structure: KEY;
12
- value: STRUCTURE;
13
- text: string | null;
14
- } : never;
15
- }[keyof T];
16
- type ToOutputValue<STRUCTURES extends StructureDefinitionArray<StructureDefinition<any, any>[]>> = ToStructureUnion<ToStructureDefinitionMap<STRUCTURES>>;
17
- /**
18
- * Generates a typed object or plain text based on the given prompt and structure definitions.
19
- * The structure definition is used as part of the final prompt.
20
- *
21
- * This function interacts with a specified model to either return a structured object conforming to one of the provided
22
- * structure definitions or a plain text response if the model decides not to return a structured object.
23
- *
24
- * For the OpenAI chat model, this generates and parses a function call with automatic function selection.
25
- *
26
- * @see https://modelfusion.dev/guide/function/generate-structure-or-text
27
- *
28
- * @example
29
- * const { structure, value, text } = await generateStructureOrText(
30
- * new OpenAIChatModel(...),
31
- * [
32
- * new ZodStructureDefinition({
33
- * name: "getCurrentWeather" as const, // mark 'as const' for type inference
34
- * description: "Get the current weather in a given location",
35
- * schema: z.object({
36
- * location: z
37
- * .string()
38
- * .describe("The city and state, e.g. San Francisco, CA"),
39
- * unit: z.enum(["celsius", "fahrenheit"]).optional(),
40
- * }),
41
- * }),
42
- * new ZodStructureDefinition({
43
- * name: "getContactInformation" as const,
44
- * description: "Get the contact information for a given person",
45
- * schema: z.object({
46
- * name: z.string().describe("The name of the person"),
47
- * }),
48
- * }),
49
- * ],
50
- * [OpenAIChatMessage.user(query)]
51
- * );
52
- *
53
- * switch (structure) {
54
- * case "getCurrentWeather": {
55
- * const { location, unit } = value;
56
- * console.log("getCurrentWeather", location, unit);
57
- * break;
58
- * }
59
- *
60
- * case "getContactInformation": {
61
- * const { name } = value;
62
- * console.log("getContactInformation", name);
63
- * break;
64
- * }
65
- *
66
- * case null: {
67
- * console.log("No function call. Generated text: ", text);
68
- * }
69
- * }
70
- *
71
- * @param {StructureOrTextGenerationModel<PROMPT, SETTINGS>} model - The model responsible for generating structured data or text.
72
- * @param {STRUCTURES} structureDefinitions - An array of StructureDefinition instances defining the possible structures of the expected response.
73
- * @param {PROMPT | ((structureDefinitions: STRUCTURES) => PROMPT)} prompt - The prompt used to generate the structure or text.
74
- * You can also pass a function that takes the array of structure definitions as an argument and returns the prompt.
75
- * @param {FunctionOptions} [options] - Additional options to control the function's execution behavior.
76
- *
77
- * @returns {Promise<{ structure: null; value: null; text: string } | ToOutputValue<STRUCTURES>>} - Returns a promise that resolves to an object containing either a structured response conforming to one of the provided definitions or a plain text response.
78
- */
79
- export declare function generateStructureOrText<STRUCTURES extends StructureDefinition<any, any>[], PROMPT>(model: StructureOrTextGenerationModel<PROMPT, StructureOrTextGenerationModelSettings>, structureDefinitions: STRUCTURES, prompt: PROMPT | ((structureDefinitions: STRUCTURES) => PROMPT), options?: FunctionOptions & {
80
- returnType?: "structure";
81
- }): Promise<{
82
- structure: null;
83
- value: null;
84
- text: string;
85
- } | ToOutputValue<STRUCTURES>>;
86
- export declare function generateStructureOrText<STRUCTURES extends StructureDefinition<any, any>[], PROMPT>(model: StructureOrTextGenerationModel<PROMPT, StructureOrTextGenerationModelSettings>, structureDefinitions: STRUCTURES, prompt: PROMPT | ((structureDefinitions: STRUCTURES) => PROMPT), options: FunctionOptions & {
87
- returnType?: "full";
88
- }): Promise<{
89
- value: {
90
- structure: null;
91
- value: null;
92
- text: string;
93
- } | ToOutputValue<STRUCTURES>;
94
- response: unknown;
95
- metadata: ModelCallMetadata;
96
- }>;
97
- export {};
@@ -1,50 +0,0 @@
1
- import { executeStandardCall } from "../executeStandardCall.js";
2
- import { NoSuchStructureError } from "./NoSuchStructureError.js";
3
- import { StructureValidationError } from "./StructureValidationError.js";
4
- export async function generateStructureOrText(model, structureDefinitions, prompt, options) {
5
- // Note: PROMPT must not be a function.
6
- const expandedPrompt = typeof prompt === "function"
7
- ? prompt(structureDefinitions)
8
- : prompt;
9
- const fullResponse = await executeStandardCall({
10
- functionType: "generate-structure-or-text",
11
- input: expandedPrompt,
12
- model,
13
- options,
14
- generateResponse: async (options) => {
15
- const result = await model.doGenerateStructureOrText(structureDefinitions, expandedPrompt, options);
16
- const { structure, value, text } = result.structureAndText;
17
- // text generation:
18
- if (structure == null) {
19
- return {
20
- response: result.response,
21
- extractedValue: { structure, value, text },
22
- usage: result.usage,
23
- };
24
- }
25
- const definition = structureDefinitions.find((d) => d.name === structure);
26
- if (definition == undefined) {
27
- throw new NoSuchStructureError(structure);
28
- }
29
- const parseResult = definition.schema.validate(value);
30
- if (!parseResult.success) {
31
- throw new StructureValidationError({
32
- structureName: structure,
33
- value,
34
- valueText: result.structureAndText.valueText,
35
- cause: parseResult.error,
36
- });
37
- }
38
- return {
39
- response: result.response,
40
- extractedValue: {
41
- structure: structure,
42
- value: parseResult.data,
43
- text: text, // text is string | null, which is part of the response for schema values
44
- },
45
- usage: result.usage,
46
- };
47
- },
48
- });
49
- return options?.returnType === "full" ? fullResponse : fullResponse.value;
50
- }
@@ -1,5 +0,0 @@
1
- export interface ToolCall<NAME extends string, PARAMETERS> {
2
- id: string;
3
- name: NAME;
4
- parameters: PARAMETERS;
5
- }
@@ -1,10 +0,0 @@
1
- export * from "./ToolCall.js";
2
- export * from "./ToolCallGenerationError.js";
3
- export * from "./ToolCallGenerationEvent.js";
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";
9
- export * from "./generateToolCall.js";
10
- export * from "./generateToolCallsOrText.js";
@@ -1,10 +0,0 @@
1
- export * from "./ToolCall.js";
2
- export * from "./ToolCallGenerationError.js";
3
- export * from "./ToolCallGenerationEvent.js";
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";
9
- export * from "./generateToolCall.js";
10
- export * from "./generateToolCallsOrText.js";
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NoSuchToolError = void 0;
4
- class NoSuchToolError extends Error {
5
- constructor(toolName) {
6
- super(`No such tool: ${toolName}`);
7
- Object.defineProperty(this, "toolName", {
8
- enumerable: true,
9
- configurable: true,
10
- writable: true,
11
- value: void 0
12
- });
13
- this.name = "NoSuchToolError";
14
- this.toolName = toolName;
15
- }
16
- toJSON() {
17
- return {
18
- name: this.name,
19
- toolName: this.toolName,
20
- message: this.message,
21
- stack: this.stack,
22
- };
23
- }
24
- }
25
- exports.NoSuchToolError = NoSuchToolError;
@@ -1,10 +0,0 @@
1
- export declare class NoSuchToolError extends Error {
2
- readonly toolName: string;
3
- constructor(toolName: string);
4
- toJSON(): {
5
- name: string;
6
- toolName: string;
7
- message: string;
8
- stack: string | undefined;
9
- };
10
- }
@@ -1,21 +0,0 @@
1
- export class NoSuchToolError extends Error {
2
- constructor(toolName) {
3
- super(`No such tool: ${toolName}`);
4
- Object.defineProperty(this, "toolName", {
5
- enumerable: true,
6
- configurable: true,
7
- writable: true,
8
- value: void 0
9
- });
10
- this.name = "NoSuchToolError";
11
- this.toolName = toolName;
12
- }
13
- toJSON() {
14
- return {
15
- name: this.name,
16
- toolName: this.toolName,
17
- message: this.message,
18
- stack: this.stack,
19
- };
20
- }
21
- }
@@ -1,7 +0,0 @@
1
- import { BaseFunctionFinishedEvent, BaseFunctionStartedEvent } from "../core/FunctionEvent.js";
2
- export interface UseToolOrGenerateTextStartedEvent extends BaseFunctionStartedEvent {
3
- functionType: "use-tool-or-generate-text";
4
- }
5
- export interface UseToolOrGenerateTextFinishedEvent extends BaseFunctionFinishedEvent {
6
- functionType: "use-tool-or-generate-text";
7
- }