@microsoft/teams.ai 0.2.12 → 0.2.14
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/dist/models/index.d.mts +2 -2
- package/dist/models/index.d.ts +2 -2
- package/dist/prompts/chat.d.mts +3 -2
- package/dist/prompts/chat.d.ts +3 -2
- package/dist/prompts/chat.js +20 -2
- package/dist/prompts/chat.js.map +1 -1
- package/dist/prompts/chat.mjs +20 -2
- package/dist/prompts/chat.mjs.map +1 -1
- package/dist/prompts/plugin.d.mts +14 -0
- package/dist/prompts/plugin.d.ts +14 -0
- package/package.json +1 -1
package/dist/models/index.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IAudioModel } from './audio.mjs';
|
|
2
2
|
export { AudioToTextParams, TextToAudioParams } from './audio.mjs';
|
|
3
|
-
import { IImageModel } from './image.mjs';
|
|
4
|
-
export { TextToImageParams } from './image.mjs';
|
|
5
3
|
import { IChatModel } from './chat.mjs';
|
|
6
4
|
export { ChatSendOptions, TextChunkHandler } from './chat.mjs';
|
|
5
|
+
import { IImageModel } from './image.mjs';
|
|
6
|
+
export { TextToImageParams } from './image.mjs';
|
|
7
7
|
import '../function.mjs';
|
|
8
8
|
import '../schema.mjs';
|
|
9
9
|
import '../memory.mjs';
|
package/dist/models/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IAudioModel } from './audio.js';
|
|
2
2
|
export { AudioToTextParams, TextToAudioParams } from './audio.js';
|
|
3
|
-
import { IImageModel } from './image.js';
|
|
4
|
-
export { TextToImageParams } from './image.js';
|
|
5
3
|
import { IChatModel } from './chat.js';
|
|
6
4
|
export { ChatSendOptions, TextChunkHandler } from './chat.js';
|
|
5
|
+
import { IImageModel } from './image.js';
|
|
6
|
+
export { TextToImageParams } from './image.js';
|
|
7
7
|
import '../function.js';
|
|
8
8
|
import '../schema.js';
|
|
9
9
|
import '../memory.js';
|
package/dist/prompts/chat.d.mts
CHANGED
|
@@ -130,8 +130,8 @@ declare class ChatPrompt<TOptions extends Record<string, any> = Record<string, a
|
|
|
130
130
|
protected readonly _template: ITemplate;
|
|
131
131
|
protected readonly _model: IChatModel<TOptions>;
|
|
132
132
|
constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins);
|
|
133
|
-
use(prompt:
|
|
134
|
-
use(name: string, prompt:
|
|
133
|
+
use(prompt: IChatPrompt): this;
|
|
134
|
+
use(name: string, prompt: IChatPrompt): this;
|
|
135
135
|
function(name: string, description: string, handler: FunctionHandler): this;
|
|
136
136
|
function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;
|
|
137
137
|
usePlugin<K extends TChatPromptPlugins[number]['name']>(name: K, args: Extract<TChatPromptPlugins[number], {
|
|
@@ -141,6 +141,7 @@ declare class ChatPrompt<TOptions extends Record<string, any> = Record<string, a
|
|
|
141
141
|
[key: string]: any;
|
|
142
142
|
}, R = any>(name: string, args?: A): Promise<R>;
|
|
143
143
|
send(input: string | ContentPart[], options?: ChatPromptSendOptions<TOptions>): Promise<ModelMessage>;
|
|
144
|
+
protected executeFunction<R = any>(name: string, fn: Function, args?: Record<string, any>): Promise<R>;
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
export { ChatPrompt, type ChatPromptOptions, type ChatPromptPlugin, type ChatPromptSendOptions, type IChatPrompt };
|
package/dist/prompts/chat.d.ts
CHANGED
|
@@ -130,8 +130,8 @@ declare class ChatPrompt<TOptions extends Record<string, any> = Record<string, a
|
|
|
130
130
|
protected readonly _template: ITemplate;
|
|
131
131
|
protected readonly _model: IChatModel<TOptions>;
|
|
132
132
|
constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins);
|
|
133
|
-
use(prompt:
|
|
134
|
-
use(name: string, prompt:
|
|
133
|
+
use(prompt: IChatPrompt): this;
|
|
134
|
+
use(name: string, prompt: IChatPrompt): this;
|
|
135
135
|
function(name: string, description: string, handler: FunctionHandler): this;
|
|
136
136
|
function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;
|
|
137
137
|
usePlugin<K extends TChatPromptPlugins[number]['name']>(name: K, args: Extract<TChatPromptPlugins[number], {
|
|
@@ -141,6 +141,7 @@ declare class ChatPrompt<TOptions extends Record<string, any> = Record<string, a
|
|
|
141
141
|
[key: string]: any;
|
|
142
142
|
}, R = any>(name: string, args?: A): Promise<R>;
|
|
143
143
|
send(input: string | ContentPart[], options?: ChatPromptSendOptions<TOptions>): Promise<ModelMessage>;
|
|
144
|
+
protected executeFunction<R = any>(name: string, fn: Function, args?: Record<string, any>): Promise<R>;
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
export { ChatPrompt, type ChatPromptOptions, type ChatPromptPlugin, type ChatPromptSendOptions, type IChatPrompt };
|
package/dist/prompts/chat.js
CHANGED
|
@@ -86,7 +86,7 @@ class ChatPrompt {
|
|
|
86
86
|
if (!fn) {
|
|
87
87
|
throw new Error(`function "${name}" not found`);
|
|
88
88
|
}
|
|
89
|
-
return
|
|
89
|
+
return this.executeFunction(name, fn, args);
|
|
90
90
|
}
|
|
91
91
|
async send(input, options = {}) {
|
|
92
92
|
for (const plugin of this.plugins) {
|
|
@@ -117,7 +117,10 @@ class ChatPrompt {
|
|
|
117
117
|
}
|
|
118
118
|
const fnMap = functions.reduce(
|
|
119
119
|
(acc, fn) => {
|
|
120
|
-
acc[fn.name] =
|
|
120
|
+
acc[fn.name] = {
|
|
121
|
+
...fn,
|
|
122
|
+
handler: (args) => this.executeFunction(fn.name, fn, args)
|
|
123
|
+
};
|
|
121
124
|
return acc;
|
|
122
125
|
},
|
|
123
126
|
{}
|
|
@@ -155,6 +158,21 @@ class ChatPrompt {
|
|
|
155
158
|
}
|
|
156
159
|
return output;
|
|
157
160
|
}
|
|
161
|
+
async executeFunction(name, fn, args) {
|
|
162
|
+
const processedArgs = args || {};
|
|
163
|
+
for (const plugin of this.plugins) {
|
|
164
|
+
if (plugin.onBeforeFunctionCall) {
|
|
165
|
+
await plugin.onBeforeFunctionCall(name, processedArgs);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
let result = await fn.handler(processedArgs);
|
|
169
|
+
for (const plugin of this.plugins) {
|
|
170
|
+
if (plugin.onAfterFunctionCall) {
|
|
171
|
+
result = await plugin.onAfterFunctionCall(name, processedArgs, result);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
158
176
|
}
|
|
159
177
|
|
|
160
178
|
exports.ChatPrompt = ChatPrompt;
|
package/dist/prompts/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":["StringTemplate","LocalMemory"],"mappings":"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","file":"chat.js","sourcesContent":["import { Function, FunctionHandler } from '../function';\nimport { LocalMemory } from '../local-memory';\nimport { IMemory } from '../memory';\nimport { ContentPart, Message, ModelMessage, SystemMessage, UserMessage } from '../message';\nimport { IChatModel, TextChunkHandler } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\nimport { IAiPlugin } from './plugin';\n\nexport type ChatPromptOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the name of the prompt\n */\n readonly name?: string;\n\n /**\n * the description of the prompt\n */\n readonly description?: string;\n\n /**\n * the model to send messages to\n */\n readonly model: IChatModel<TOptions>;\n\n /**\n * the defining characteristics/objective\n * of the prompt. This is commonly used to provide a system prompt.\n * If you supply the system prompt as part of the messages,\n * you do not need to supply this option.\n */\n readonly instructions?: string | string[] | ITemplate;\n\n /**\n * the `role` of the initial message\n */\n readonly role?: 'system' | 'user';\n\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n};\n\nexport type ChatPromptSendOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n\n /**\n * the models request options\n */\n readonly request?: TOptions;\n\n /**\n * the callback to be called for each\n * stream chunk\n */\n readonly onChunk?: TextChunkHandler;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport interface IChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> {\n /**\n * the prompt name\n */\n readonly name: string;\n\n /**\n * the prompt description\n */\n readonly description: string;\n\n /**\n * the chat history\n */\n readonly messages: IMemory;\n\n /**\n * the registered functions\n */\n readonly functions: Array<Function>;\n\n /**\n * the chat model\n */\n plugins: TChatPromptPlugins;\n\n /**\n * add another chat prompt as a\n */\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n\n /**\n * add a function that can be called\n * by the model\n */\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n\n usePlugin<TPluginName extends TChatPromptPlugins[number]['name']>(\n name: TPluginName,\n args: Extract<TChatPromptPlugins[number], { name: TPluginName }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this;\n\n /**\n * call a function\n */\n call<A extends Record<string, any>, R = any>(name: string, args?: A): Promise<R>;\n\n /**\n * send a message to the model and get a response\n */\n send(\n input: string | ContentPart[],\n options?: ChatPromptSendOptions<TOptions>\n ): Promise<Pick<ModelMessage, 'content'> & Omit<ModelMessage, 'content'>>;\n}\n\nexport type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = IAiPlugin<\n TPluginName,\n TPluginUseArgs,\n Parameters<IChatPrompt['send']>[0],\n ReturnType<IChatPrompt['send']>\n> & {\n /**\n * Optionally passed in to modify the functions array that\n * is passed to the model\n * @param functions\n * @returns Functions\n */\n onBuildFunctions?: (functions: Function[]) => Function[] | Promise<Function[]>;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport class ChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> implements IChatPrompt<TOptions, TChatPromptPlugins>\n{\n get name() {\n return this._name;\n }\n protected readonly _name: string;\n\n get description() {\n return this._description;\n }\n protected readonly _description: string;\n\n get messages() {\n return this._messages;\n }\n protected readonly _messages: IMemory;\n\n get functions() {\n return Object.values(this._functions);\n }\n protected readonly _functions: Record<string, Function> = {};\n\n get plugins() {\n return this._plugins;\n }\n protected readonly _plugins: TChatPromptPlugins;\n\n protected readonly _role: 'system' | 'user';\n protected readonly _template: ITemplate;\n protected readonly _model: IChatModel<TOptions>;\n\n constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins) {\n this._name = options.name || 'chat';\n this._description = options.description || 'an agent you can chat with';\n this._role = options.role || 'system';\n this._model = options.model;\n this._template = Array.isArray(options.instructions)\n ? new StringTemplate(options.instructions.join('\\n'))\n : typeof options.instructions !== 'object'\n ? new StringTemplate(options.instructions)\n : options.instructions;\n\n this._messages =\n typeof options.messages === 'object' && !Array.isArray(options.messages)\n ? options.messages\n : new LocalMemory({ messages: options.messages || [] });\n\n this._plugins = plugins || ([] as unknown as TChatPromptPlugins);\n }\n\n use(prompt: ChatPrompt): this;\n use(name: string, prompt: ChatPrompt): this;\n use(...args: any[]) {\n const prompt: ChatPrompt = args.length === 1 ? args[0] : args[1];\n const name: string = args.length === 1 ? prompt.name : args[0];\n this._functions[name] = {\n name,\n description: prompt.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'the text to send to the assistant',\n },\n },\n required: ['text'],\n },\n handler: ({ text }: { text: string }) => {\n return prompt.send(text);\n },\n };\n\n return this;\n }\n\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n function(...args: any[]) {\n const name: string = args[0];\n const description: string = args[1];\n const parameters: Schema | null = args.length === 3 ? null : args[2];\n const handler: FunctionHandler = args[args.length - 1];\n this._functions[name] = {\n name,\n description,\n parameters: parameters || {},\n handler,\n };\n\n return this;\n }\n\n usePlugin<K extends TChatPromptPlugins[number]['name']>(\n name: K,\n args: Extract<TChatPromptPlugins[number], { name: K }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this {\n const plugin = this._plugins.find((p) => p.name === name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n plugin.onUsePlugin(args);\n }\n\n return this;\n }\n\n async call<A extends { [key: string]: any }, R = any>(name: string, args?: A): Promise<R> {\n const fn = this._functions[name];\n\n if (!fn) {\n throw new Error(`function \"${name}\" not found`);\n }\n\n return await fn.handler(args || {});\n }\n\n async send(input: string | ContentPart[], options: ChatPromptSendOptions<TOptions> = {}) {\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n input = await plugin.onBeforeSend(input);\n }\n }\n\n const { onChunk } = options;\n\n if (typeof input === 'string') {\n input = input.trim();\n }\n\n const messages = !Array.isArray(options.messages)\n ? options.messages || this._messages\n : new LocalMemory({ messages: options.messages || [] });\n\n let buffer = '';\n let system: SystemMessage | UserMessage | undefined = undefined;\n const prompt = await this._template.render();\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n }\n\n let functions = Object.values(this._functions);\n const pluginsWithOnBuildFunctions = this._plugins.filter(\n (plugin): plugin is WithRequired<TChatPromptPlugins[number], 'onBuildFunctions'> =>\n plugin.onBuildFunctions != null\n );\n for (const plugin of pluginsWithOnBuildFunctions) {\n functions = await plugin.onBuildFunctions(functions);\n }\n\n const fnMap = functions.reduce(\n (acc, fn) => {\n acc[fn.name] = fn;\n return acc;\n },\n {} as Record<string, Function>\n );\n\n const res = await this._model.send(\n {\n role: 'user',\n content: input,\n },\n {\n system,\n messages,\n request: options.request,\n functions: fnMap,\n onChunk: async (chunk) => {\n if (!chunk || !onChunk) return;\n buffer += chunk;\n\n try {\n await onChunk(buffer);\n buffer = '';\n } catch (err) {\n return;\n }\n },\n }\n );\n\n let output: Awaited<ReturnType<typeof this._model.send>> = {\n ...res,\n content: res.content || '',\n };\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n output = await plugin.onAfterSend(output);\n }\n }\n\n return output;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":["StringTemplate","LocalMemory"],"mappings":"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","file":"chat.js","sourcesContent":["import { Function, FunctionHandler } from '../function';\nimport { LocalMemory } from '../local-memory';\nimport { IMemory } from '../memory';\nimport { ContentPart, Message, ModelMessage, SystemMessage, UserMessage } from '../message';\nimport { IChatModel, TextChunkHandler } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { IAiPlugin } from './plugin';\n\nexport type ChatPromptOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the name of the prompt\n */\n readonly name?: string;\n\n /**\n * the description of the prompt\n */\n readonly description?: string;\n\n /**\n * the model to send messages to\n */\n readonly model: IChatModel<TOptions>;\n\n /**\n * the defining characteristics/objective\n * of the prompt. This is commonly used to provide a system prompt.\n * If you supply the system prompt as part of the messages,\n * you do not need to supply this option.\n */\n readonly instructions?: string | string[] | ITemplate;\n\n /**\n * the `role` of the initial message\n */\n readonly role?: 'system' | 'user';\n\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n};\n\nexport type ChatPromptSendOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n\n /**\n * the models request options\n */\n readonly request?: TOptions;\n\n /**\n * the callback to be called for each\n * stream chunk\n */\n readonly onChunk?: TextChunkHandler;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport interface IChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> {\n /**\n * the prompt name\n */\n readonly name: string;\n\n /**\n * the prompt description\n */\n readonly description: string;\n\n /**\n * the chat history\n */\n readonly messages: IMemory;\n\n /**\n * the registered functions\n */\n readonly functions: Array<Function>;\n\n /**\n * the chat model\n */\n plugins: TChatPromptPlugins;\n\n /**\n * add another chat prompt as a\n */\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n\n /**\n * add a function that can be called\n * by the model\n */\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n\n usePlugin<TPluginName extends TChatPromptPlugins[number]['name']>(\n name: TPluginName,\n args: Extract<TChatPromptPlugins[number], { name: TPluginName }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this;\n\n /**\n * call a function\n */\n call<A extends Record<string, any>, R = any>(name: string, args?: A): Promise<R>;\n\n /**\n * send a message to the model and get a response\n */\n send(\n input: string | ContentPart[],\n options?: ChatPromptSendOptions<TOptions>\n ): Promise<Pick<ModelMessage, 'content'> & Omit<ModelMessage, 'content'>>;\n}\n\nexport type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = IAiPlugin<\n TPluginName,\n TPluginUseArgs,\n Parameters<IChatPrompt['send']>[0],\n ReturnType<IChatPrompt['send']>\n> & {\n /**\n * Optionally passed in to modify the functions array that\n * is passed to the model\n * @param functions\n * @returns Functions\n */\n onBuildFunctions?: (functions: Function[]) => Function[] | Promise<Function[]>;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport class ChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> implements IChatPrompt<TOptions, TChatPromptPlugins> {\n get name() {\n return this._name;\n }\n protected readonly _name: string;\n\n get description() {\n return this._description;\n }\n protected readonly _description: string;\n\n get messages() {\n return this._messages;\n }\n protected readonly _messages: IMemory;\n\n get functions() {\n return Object.values(this._functions);\n }\n protected readonly _functions: Record<string, Function> = {};\n\n get plugins() {\n return this._plugins;\n }\n protected readonly _plugins: TChatPromptPlugins;\n\n protected readonly _role: 'system' | 'user';\n protected readonly _template: ITemplate;\n protected readonly _model: IChatModel<TOptions>;\n\n constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins) {\n this._name = options.name || 'chat';\n this._description = options.description || 'an agent you can chat with';\n this._role = options.role || 'system';\n this._model = options.model;\n this._template = Array.isArray(options.instructions)\n ? new StringTemplate(options.instructions.join('\\n'))\n : typeof options.instructions !== 'object'\n ? new StringTemplate(options.instructions)\n : options.instructions;\n\n this._messages =\n typeof options.messages === 'object' && !Array.isArray(options.messages)\n ? options.messages\n : new LocalMemory({ messages: options.messages || [] });\n\n this._plugins = plugins || ([] as unknown as TChatPromptPlugins);\n }\n\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n use(...args: any[]) {\n const prompt: IChatPrompt = args.length === 1 ? args[0] : args[1];\n const name: string = args.length === 1 ? prompt.name : args[0];\n this._functions[name] = {\n name,\n description: prompt.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'the text to send to the assistant',\n },\n },\n required: ['text'],\n },\n handler: ({ text }: { text: string }) => {\n return prompt.send(text);\n },\n };\n\n return this;\n }\n\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n function(...args: any[]) {\n const name: string = args[0];\n const description: string = args[1];\n const parameters: Schema | null = args.length === 3 ? null : args[2];\n const handler: FunctionHandler = args[args.length - 1];\n this._functions[name] = {\n name,\n description,\n parameters: parameters || {},\n handler,\n };\n\n return this;\n }\n\n usePlugin<K extends TChatPromptPlugins[number]['name']>(\n name: K,\n args: Extract<TChatPromptPlugins[number], { name: K }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this {\n const plugin = this._plugins.find((p) => p.name === name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n plugin.onUsePlugin(args);\n }\n\n return this;\n }\n\n async call<A extends { [key: string]: any }, R = any>(name: string, args?: A): Promise<R> {\n const fn = this._functions[name];\n if (!fn) {\n throw new Error(`function \"${name}\" not found`);\n }\n return this.executeFunction(name, fn, args);\n }\n\n async send(input: string | ContentPart[], options: ChatPromptSendOptions<TOptions> = {}) {\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n input = await plugin.onBeforeSend(input);\n }\n }\n\n const { onChunk } = options;\n\n if (typeof input === 'string') {\n input = input.trim();\n }\n\n const messages = !Array.isArray(options.messages)\n ? options.messages || this._messages\n : new LocalMemory({ messages: options.messages || [] });\n\n let buffer = '';\n let system: SystemMessage | UserMessage | undefined = undefined;\n const prompt = await this._template.render();\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n }\n\n let functions = Object.values(this._functions);\n const pluginsWithOnBuildFunctions = this._plugins.filter(\n (plugin): plugin is WithRequired<TChatPromptPlugins[number], 'onBuildFunctions'> =>\n plugin.onBuildFunctions != null\n );\n for (const plugin of pluginsWithOnBuildFunctions) {\n functions = await plugin.onBuildFunctions(functions);\n }\n\n const fnMap = functions.reduce(\n (acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n },\n {} as Record<string, Function>\n );\n\n const res = await this._model.send(\n {\n role: 'user',\n content: input,\n },\n {\n system,\n messages,\n request: options.request,\n functions: fnMap,\n onChunk: async (chunk) => {\n if (!chunk || !onChunk) return;\n buffer += chunk;\n\n try {\n await onChunk(buffer);\n buffer = '';\n } catch (err) {\n return;\n }\n },\n }\n );\n\n let output: Awaited<ReturnType<typeof this._model.send>> = {\n ...res,\n content: res.content || '',\n };\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n output = await plugin.onAfterSend(output);\n }\n }\n\n return output;\n }\n\n protected async executeFunction<R = any>(\n name: string,\n fn: Function,\n args?: Record<string, any>\n ): Promise<R> {\n const processedArgs = args || {};\n\n // Execute beforeFunctionCall hooks\n for (const plugin of this.plugins) {\n if (plugin.onBeforeFunctionCall) {\n await plugin.onBeforeFunctionCall(name, processedArgs);\n }\n }\n\n // Call the function\n let result = await fn.handler(processedArgs);\n\n // Execute afterFunctionCall hooks\n for (const plugin of this.plugins) {\n if (plugin.onAfterFunctionCall) {\n result = await plugin.onAfterFunctionCall(name, processedArgs, result);\n }\n }\n\n return result;\n }\n}\n"]}
|
package/dist/prompts/chat.mjs
CHANGED
|
@@ -84,7 +84,7 @@ class ChatPrompt {
|
|
|
84
84
|
if (!fn) {
|
|
85
85
|
throw new Error(`function "${name}" not found`);
|
|
86
86
|
}
|
|
87
|
-
return
|
|
87
|
+
return this.executeFunction(name, fn, args);
|
|
88
88
|
}
|
|
89
89
|
async send(input, options = {}) {
|
|
90
90
|
for (const plugin of this.plugins) {
|
|
@@ -115,7 +115,10 @@ class ChatPrompt {
|
|
|
115
115
|
}
|
|
116
116
|
const fnMap = functions.reduce(
|
|
117
117
|
(acc, fn) => {
|
|
118
|
-
acc[fn.name] =
|
|
118
|
+
acc[fn.name] = {
|
|
119
|
+
...fn,
|
|
120
|
+
handler: (args) => this.executeFunction(fn.name, fn, args)
|
|
121
|
+
};
|
|
119
122
|
return acc;
|
|
120
123
|
},
|
|
121
124
|
{}
|
|
@@ -153,6 +156,21 @@ class ChatPrompt {
|
|
|
153
156
|
}
|
|
154
157
|
return output;
|
|
155
158
|
}
|
|
159
|
+
async executeFunction(name, fn, args) {
|
|
160
|
+
const processedArgs = args || {};
|
|
161
|
+
for (const plugin of this.plugins) {
|
|
162
|
+
if (plugin.onBeforeFunctionCall) {
|
|
163
|
+
await plugin.onBeforeFunctionCall(name, processedArgs);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
let result = await fn.handler(processedArgs);
|
|
167
|
+
for (const plugin of this.plugins) {
|
|
168
|
+
if (plugin.onAfterFunctionCall) {
|
|
169
|
+
result = await plugin.onAfterFunctionCall(name, processedArgs, result);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
156
174
|
}
|
|
157
175
|
|
|
158
176
|
export { ChatPrompt };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":[],"mappings":"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","file":"chat.mjs","sourcesContent":["import { Function, FunctionHandler } from '../function';\nimport { LocalMemory } from '../local-memory';\nimport { IMemory } from '../memory';\nimport { ContentPart, Message, ModelMessage, SystemMessage, UserMessage } from '../message';\nimport { IChatModel, TextChunkHandler } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\nimport { IAiPlugin } from './plugin';\n\nexport type ChatPromptOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the name of the prompt\n */\n readonly name?: string;\n\n /**\n * the description of the prompt\n */\n readonly description?: string;\n\n /**\n * the model to send messages to\n */\n readonly model: IChatModel<TOptions>;\n\n /**\n * the defining characteristics/objective\n * of the prompt. This is commonly used to provide a system prompt.\n * If you supply the system prompt as part of the messages,\n * you do not need to supply this option.\n */\n readonly instructions?: string | string[] | ITemplate;\n\n /**\n * the `role` of the initial message\n */\n readonly role?: 'system' | 'user';\n\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n};\n\nexport type ChatPromptSendOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n\n /**\n * the models request options\n */\n readonly request?: TOptions;\n\n /**\n * the callback to be called for each\n * stream chunk\n */\n readonly onChunk?: TextChunkHandler;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport interface IChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> {\n /**\n * the prompt name\n */\n readonly name: string;\n\n /**\n * the prompt description\n */\n readonly description: string;\n\n /**\n * the chat history\n */\n readonly messages: IMemory;\n\n /**\n * the registered functions\n */\n readonly functions: Array<Function>;\n\n /**\n * the chat model\n */\n plugins: TChatPromptPlugins;\n\n /**\n * add another chat prompt as a\n */\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n\n /**\n * add a function that can be called\n * by the model\n */\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n\n usePlugin<TPluginName extends TChatPromptPlugins[number]['name']>(\n name: TPluginName,\n args: Extract<TChatPromptPlugins[number], { name: TPluginName }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this;\n\n /**\n * call a function\n */\n call<A extends Record<string, any>, R = any>(name: string, args?: A): Promise<R>;\n\n /**\n * send a message to the model and get a response\n */\n send(\n input: string | ContentPart[],\n options?: ChatPromptSendOptions<TOptions>\n ): Promise<Pick<ModelMessage, 'content'> & Omit<ModelMessage, 'content'>>;\n}\n\nexport type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = IAiPlugin<\n TPluginName,\n TPluginUseArgs,\n Parameters<IChatPrompt['send']>[0],\n ReturnType<IChatPrompt['send']>\n> & {\n /**\n * Optionally passed in to modify the functions array that\n * is passed to the model\n * @param functions\n * @returns Functions\n */\n onBuildFunctions?: (functions: Function[]) => Function[] | Promise<Function[]>;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport class ChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> implements IChatPrompt<TOptions, TChatPromptPlugins>\n{\n get name() {\n return this._name;\n }\n protected readonly _name: string;\n\n get description() {\n return this._description;\n }\n protected readonly _description: string;\n\n get messages() {\n return this._messages;\n }\n protected readonly _messages: IMemory;\n\n get functions() {\n return Object.values(this._functions);\n }\n protected readonly _functions: Record<string, Function> = {};\n\n get plugins() {\n return this._plugins;\n }\n protected readonly _plugins: TChatPromptPlugins;\n\n protected readonly _role: 'system' | 'user';\n protected readonly _template: ITemplate;\n protected readonly _model: IChatModel<TOptions>;\n\n constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins) {\n this._name = options.name || 'chat';\n this._description = options.description || 'an agent you can chat with';\n this._role = options.role || 'system';\n this._model = options.model;\n this._template = Array.isArray(options.instructions)\n ? new StringTemplate(options.instructions.join('\\n'))\n : typeof options.instructions !== 'object'\n ? new StringTemplate(options.instructions)\n : options.instructions;\n\n this._messages =\n typeof options.messages === 'object' && !Array.isArray(options.messages)\n ? options.messages\n : new LocalMemory({ messages: options.messages || [] });\n\n this._plugins = plugins || ([] as unknown as TChatPromptPlugins);\n }\n\n use(prompt: ChatPrompt): this;\n use(name: string, prompt: ChatPrompt): this;\n use(...args: any[]) {\n const prompt: ChatPrompt = args.length === 1 ? args[0] : args[1];\n const name: string = args.length === 1 ? prompt.name : args[0];\n this._functions[name] = {\n name,\n description: prompt.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'the text to send to the assistant',\n },\n },\n required: ['text'],\n },\n handler: ({ text }: { text: string }) => {\n return prompt.send(text);\n },\n };\n\n return this;\n }\n\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n function(...args: any[]) {\n const name: string = args[0];\n const description: string = args[1];\n const parameters: Schema | null = args.length === 3 ? null : args[2];\n const handler: FunctionHandler = args[args.length - 1];\n this._functions[name] = {\n name,\n description,\n parameters: parameters || {},\n handler,\n };\n\n return this;\n }\n\n usePlugin<K extends TChatPromptPlugins[number]['name']>(\n name: K,\n args: Extract<TChatPromptPlugins[number], { name: K }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this {\n const plugin = this._plugins.find((p) => p.name === name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n plugin.onUsePlugin(args);\n }\n\n return this;\n }\n\n async call<A extends { [key: string]: any }, R = any>(name: string, args?: A): Promise<R> {\n const fn = this._functions[name];\n\n if (!fn) {\n throw new Error(`function \"${name}\" not found`);\n }\n\n return await fn.handler(args || {});\n }\n\n async send(input: string | ContentPart[], options: ChatPromptSendOptions<TOptions> = {}) {\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n input = await plugin.onBeforeSend(input);\n }\n }\n\n const { onChunk } = options;\n\n if (typeof input === 'string') {\n input = input.trim();\n }\n\n const messages = !Array.isArray(options.messages)\n ? options.messages || this._messages\n : new LocalMemory({ messages: options.messages || [] });\n\n let buffer = '';\n let system: SystemMessage | UserMessage | undefined = undefined;\n const prompt = await this._template.render();\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n }\n\n let functions = Object.values(this._functions);\n const pluginsWithOnBuildFunctions = this._plugins.filter(\n (plugin): plugin is WithRequired<TChatPromptPlugins[number], 'onBuildFunctions'> =>\n plugin.onBuildFunctions != null\n );\n for (const plugin of pluginsWithOnBuildFunctions) {\n functions = await plugin.onBuildFunctions(functions);\n }\n\n const fnMap = functions.reduce(\n (acc, fn) => {\n acc[fn.name] = fn;\n return acc;\n },\n {} as Record<string, Function>\n );\n\n const res = await this._model.send(\n {\n role: 'user',\n content: input,\n },\n {\n system,\n messages,\n request: options.request,\n functions: fnMap,\n onChunk: async (chunk) => {\n if (!chunk || !onChunk) return;\n buffer += chunk;\n\n try {\n await onChunk(buffer);\n buffer = '';\n } catch (err) {\n return;\n }\n },\n }\n );\n\n let output: Awaited<ReturnType<typeof this._model.send>> = {\n ...res,\n content: res.content || '',\n };\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n output = await plugin.onAfterSend(output);\n }\n }\n\n return output;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":[],"mappings":"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","file":"chat.mjs","sourcesContent":["import { Function, FunctionHandler } from '../function';\nimport { LocalMemory } from '../local-memory';\nimport { IMemory } from '../memory';\nimport { ContentPart, Message, ModelMessage, SystemMessage, UserMessage } from '../message';\nimport { IChatModel, TextChunkHandler } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { IAiPlugin } from './plugin';\n\nexport type ChatPromptOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the name of the prompt\n */\n readonly name?: string;\n\n /**\n * the description of the prompt\n */\n readonly description?: string;\n\n /**\n * the model to send messages to\n */\n readonly model: IChatModel<TOptions>;\n\n /**\n * the defining characteristics/objective\n * of the prompt. This is commonly used to provide a system prompt.\n * If you supply the system prompt as part of the messages,\n * you do not need to supply this option.\n */\n readonly instructions?: string | string[] | ITemplate;\n\n /**\n * the `role` of the initial message\n */\n readonly role?: 'system' | 'user';\n\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n};\n\nexport type ChatPromptSendOptions<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * the conversation history\n */\n readonly messages?: Message[] | IMemory;\n\n /**\n * the models request options\n */\n readonly request?: TOptions;\n\n /**\n * the callback to be called for each\n * stream chunk\n */\n readonly onChunk?: TextChunkHandler;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport interface IChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> {\n /**\n * the prompt name\n */\n readonly name: string;\n\n /**\n * the prompt description\n */\n readonly description: string;\n\n /**\n * the chat history\n */\n readonly messages: IMemory;\n\n /**\n * the registered functions\n */\n readonly functions: Array<Function>;\n\n /**\n * the chat model\n */\n plugins: TChatPromptPlugins;\n\n /**\n * add another chat prompt as a\n */\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n\n /**\n * add a function that can be called\n * by the model\n */\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n\n usePlugin<TPluginName extends TChatPromptPlugins[number]['name']>(\n name: TPluginName,\n args: Extract<TChatPromptPlugins[number], { name: TPluginName }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this;\n\n /**\n * call a function\n */\n call<A extends Record<string, any>, R = any>(name: string, args?: A): Promise<R>;\n\n /**\n * send a message to the model and get a response\n */\n send(\n input: string | ContentPart[],\n options?: ChatPromptSendOptions<TOptions>\n ): Promise<Pick<ModelMessage, 'content'> & Omit<ModelMessage, 'content'>>;\n}\n\nexport type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = IAiPlugin<\n TPluginName,\n TPluginUseArgs,\n Parameters<IChatPrompt['send']>[0],\n ReturnType<IChatPrompt['send']>\n> & {\n /**\n * Optionally passed in to modify the functions array that\n * is passed to the model\n * @param functions\n * @returns Functions\n */\n onBuildFunctions?: (functions: Function[]) => Function[] | Promise<Function[]>;\n};\n\n/**\n * a prompt that can interface with a\n * chat model that provides utility like\n * streaming and function calling\n */\nexport class ChatPrompt<\n TOptions extends Record<string, any> = Record<string, any>,\n TChatPromptPlugins extends readonly ChatPromptPlugin<string, any>[] = [],\n> implements IChatPrompt<TOptions, TChatPromptPlugins> {\n get name() {\n return this._name;\n }\n protected readonly _name: string;\n\n get description() {\n return this._description;\n }\n protected readonly _description: string;\n\n get messages() {\n return this._messages;\n }\n protected readonly _messages: IMemory;\n\n get functions() {\n return Object.values(this._functions);\n }\n protected readonly _functions: Record<string, Function> = {};\n\n get plugins() {\n return this._plugins;\n }\n protected readonly _plugins: TChatPromptPlugins;\n\n protected readonly _role: 'system' | 'user';\n protected readonly _template: ITemplate;\n protected readonly _model: IChatModel<TOptions>;\n\n constructor(options: ChatPromptOptions<TOptions>, plugins?: TChatPromptPlugins) {\n this._name = options.name || 'chat';\n this._description = options.description || 'an agent you can chat with';\n this._role = options.role || 'system';\n this._model = options.model;\n this._template = Array.isArray(options.instructions)\n ? new StringTemplate(options.instructions.join('\\n'))\n : typeof options.instructions !== 'object'\n ? new StringTemplate(options.instructions)\n : options.instructions;\n\n this._messages =\n typeof options.messages === 'object' && !Array.isArray(options.messages)\n ? options.messages\n : new LocalMemory({ messages: options.messages || [] });\n\n this._plugins = plugins || ([] as unknown as TChatPromptPlugins);\n }\n\n use(prompt: IChatPrompt): this;\n use(name: string, prompt: IChatPrompt): this;\n use(...args: any[]) {\n const prompt: IChatPrompt = args.length === 1 ? args[0] : args[1];\n const name: string = args.length === 1 ? prompt.name : args[0];\n this._functions[name] = {\n name,\n description: prompt.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'the text to send to the assistant',\n },\n },\n required: ['text'],\n },\n handler: ({ text }: { text: string }) => {\n return prompt.send(text);\n },\n };\n\n return this;\n }\n\n function(name: string, description: string, handler: FunctionHandler): this;\n function(name: string, description: string, parameters: Schema, handler: FunctionHandler): this;\n function(...args: any[]) {\n const name: string = args[0];\n const description: string = args[1];\n const parameters: Schema | null = args.length === 3 ? null : args[2];\n const handler: FunctionHandler = args[args.length - 1];\n this._functions[name] = {\n name,\n description,\n parameters: parameters || {},\n handler,\n };\n\n return this;\n }\n\n usePlugin<K extends TChatPromptPlugins[number]['name']>(\n name: K,\n args: Extract<TChatPromptPlugins[number], { name: K }>['onUsePlugin'] extends\n | ((args: infer U) => void)\n | undefined\n ? U\n : never\n ): this {\n const plugin = this._plugins.find((p) => p.name === name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n plugin.onUsePlugin(args);\n }\n\n return this;\n }\n\n async call<A extends { [key: string]: any }, R = any>(name: string, args?: A): Promise<R> {\n const fn = this._functions[name];\n if (!fn) {\n throw new Error(`function \"${name}\" not found`);\n }\n return this.executeFunction(name, fn, args);\n }\n\n async send(input: string | ContentPart[], options: ChatPromptSendOptions<TOptions> = {}) {\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n input = await plugin.onBeforeSend(input);\n }\n }\n\n const { onChunk } = options;\n\n if (typeof input === 'string') {\n input = input.trim();\n }\n\n const messages = !Array.isArray(options.messages)\n ? options.messages || this._messages\n : new LocalMemory({ messages: options.messages || [] });\n\n let buffer = '';\n let system: SystemMessage | UserMessage | undefined = undefined;\n const prompt = await this._template.render();\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n }\n\n let functions = Object.values(this._functions);\n const pluginsWithOnBuildFunctions = this._plugins.filter(\n (plugin): plugin is WithRequired<TChatPromptPlugins[number], 'onBuildFunctions'> =>\n plugin.onBuildFunctions != null\n );\n for (const plugin of pluginsWithOnBuildFunctions) {\n functions = await plugin.onBuildFunctions(functions);\n }\n\n const fnMap = functions.reduce(\n (acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n },\n {} as Record<string, Function>\n );\n\n const res = await this._model.send(\n {\n role: 'user',\n content: input,\n },\n {\n system,\n messages,\n request: options.request,\n functions: fnMap,\n onChunk: async (chunk) => {\n if (!chunk || !onChunk) return;\n buffer += chunk;\n\n try {\n await onChunk(buffer);\n buffer = '';\n } catch (err) {\n return;\n }\n },\n }\n );\n\n let output: Awaited<ReturnType<typeof this._model.send>> = {\n ...res,\n content: res.content || '',\n };\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n output = await plugin.onAfterSend(output);\n }\n }\n\n return output;\n }\n\n protected async executeFunction<R = any>(\n name: string,\n fn: Function,\n args?: Record<string, any>\n ): Promise<R> {\n const processedArgs = args || {};\n\n // Execute beforeFunctionCall hooks\n for (const plugin of this.plugins) {\n if (plugin.onBeforeFunctionCall) {\n await plugin.onBeforeFunctionCall(name, processedArgs);\n }\n }\n\n // Call the function\n let result = await fn.handler(processedArgs);\n\n // Execute afterFunctionCall hooks\n for (const plugin of this.plugins) {\n if (plugin.onAfterFunctionCall) {\n result = await plugin.onAfterFunctionCall(name, processedArgs, result);\n }\n }\n\n return result;\n }\n}\n"]}
|
|
@@ -21,6 +21,20 @@ interface IAiPlugin<TPluginName extends string = string, TPluginUseArgs extends
|
|
|
21
21
|
* @returns the modified output result of the send function
|
|
22
22
|
*/
|
|
23
23
|
onAfterSend?: (response: Awaited<TAfterSendResponse>) => Awaited<TAfterSendResponse> | Promise<Awaited<TAfterSendResponse>>;
|
|
24
|
+
/**
|
|
25
|
+
* Called before a function is executed, allowing modification of the arguments
|
|
26
|
+
* @param functionName the name of the function being called
|
|
27
|
+
* @param args the arguments being passed to the function
|
|
28
|
+
*/
|
|
29
|
+
onBeforeFunctionCall?: (functionName: string, args: Record<string, any>) => void | Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Called after a function is executed, allowing modification of the result
|
|
32
|
+
* @param functionName the name of the function that was called
|
|
33
|
+
* @param args the arguments that were passed to the function
|
|
34
|
+
* @param result the result returned by the function
|
|
35
|
+
* @returns the modified result
|
|
36
|
+
*/
|
|
37
|
+
onAfterFunctionCall?: (functionName: string, args: Record<string, any>, result: any) => any | Promise<any>;
|
|
24
38
|
}
|
|
25
39
|
|
|
26
40
|
export type { IAiPlugin };
|
package/dist/prompts/plugin.d.ts
CHANGED
|
@@ -21,6 +21,20 @@ interface IAiPlugin<TPluginName extends string = string, TPluginUseArgs extends
|
|
|
21
21
|
* @returns the modified output result of the send function
|
|
22
22
|
*/
|
|
23
23
|
onAfterSend?: (response: Awaited<TAfterSendResponse>) => Awaited<TAfterSendResponse> | Promise<Awaited<TAfterSendResponse>>;
|
|
24
|
+
/**
|
|
25
|
+
* Called before a function is executed, allowing modification of the arguments
|
|
26
|
+
* @param functionName the name of the function being called
|
|
27
|
+
* @param args the arguments being passed to the function
|
|
28
|
+
*/
|
|
29
|
+
onBeforeFunctionCall?: (functionName: string, args: Record<string, any>) => void | Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Called after a function is executed, allowing modification of the result
|
|
32
|
+
* @param functionName the name of the function that was called
|
|
33
|
+
* @param args the arguments that were passed to the function
|
|
34
|
+
* @param result the result returned by the function
|
|
35
|
+
* @returns the modified result
|
|
36
|
+
*/
|
|
37
|
+
onAfterFunctionCall?: (functionName: string, args: Record<string, any>, result: any) => any | Promise<any>;
|
|
24
38
|
}
|
|
25
39
|
|
|
26
40
|
export type { IAiPlugin };
|