@microsoft/teams.ai 2.0.0-preview.2 → 2.0.0-preview.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/prompts/chat.d.mts +8 -1
- package/dist/prompts/chat.d.ts +8 -1
- package/dist/prompts/chat.js +10 -1
- package/dist/prompts/chat.js.map +1 -1
- package/dist/prompts/chat.mjs +10 -1
- package/dist/prompts/chat.mjs.map +1 -1
- package/dist/prompts/index.d.mts +1 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/utils/types.d.mts +2 -1
- package/dist/utils/types.d.ts +2 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<p>
|
|
4
4
|
<a href="https://www.npmjs.com/package/@microsoft/teams.ai" target="_blank">
|
|
5
|
-
<img src="https://img.shields.io/npm/v/@microsoft/teams.ai" />
|
|
5
|
+
<img src="https://img.shields.io/npm/v/@microsoft/teams.ai/preview" />
|
|
6
6
|
</a>
|
|
7
7
|
<a href="https://www.npmjs.com/package/@microsoft/teams.ai?activeTab=code" target="_blank">
|
|
8
8
|
<img src="https://img.shields.io/bundlephobia/min/@microsoft/teams.ai" />
|
package/dist/index.d.mts
CHANGED
|
@@ -14,4 +14,5 @@ export { IImageModel, TextToImageParams } from './models/image.mjs';
|
|
|
14
14
|
export { ChatPrompt, ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './prompts/chat.mjs';
|
|
15
15
|
export { AudioPrompt, AudioPromptOptions, IAudioPrompt } from './prompts/audio.mjs';
|
|
16
16
|
import '@microsoft/teams.common';
|
|
17
|
+
import './utils/types.mjs';
|
|
17
18
|
import './prompts/plugin.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ export { IImageModel, TextToImageParams } from './models/image.js';
|
|
|
14
14
|
export { ChatPrompt, ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './prompts/chat.js';
|
|
15
15
|
export { AudioPrompt, AudioPromptOptions, IAudioPrompt } from './prompts/audio.js';
|
|
16
16
|
import '@microsoft/teams.common';
|
|
17
|
+
import './utils/types.js';
|
|
17
18
|
import './prompts/plugin.js';
|
package/dist/prompts/chat.d.mts
CHANGED
|
@@ -5,6 +5,7 @@ import { Message, ContentPart, ModelMessage } from '../message.mjs';
|
|
|
5
5
|
import { IChatModel, TextChunkHandler } from '../models/chat.mjs';
|
|
6
6
|
import { Schema } from '../schema.mjs';
|
|
7
7
|
import { ITemplate } from '../template.mjs';
|
|
8
|
+
import { PromiseOrValue } from '../utils/types.mjs';
|
|
8
9
|
import { IAiPlugin } from './plugin.mjs';
|
|
9
10
|
import '../citation.mjs';
|
|
10
11
|
|
|
@@ -113,7 +114,13 @@ type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = I
|
|
|
113
114
|
* @param functions
|
|
114
115
|
* @returns Functions
|
|
115
116
|
*/
|
|
116
|
-
onBuildFunctions?: (functions: Function[]) =>
|
|
117
|
+
onBuildFunctions?: (functions: Function[]) => PromiseOrValue<Function[]>;
|
|
118
|
+
/**
|
|
119
|
+
* Optionally passed in to modify the system prompt before it is sent to the model.
|
|
120
|
+
* @param systemPrompt The system prompt string (or undefined)
|
|
121
|
+
* @returns The modified system prompt string (or undefined)
|
|
122
|
+
*/
|
|
123
|
+
onBuildPrompt?: (systemPrompt: string | undefined) => PromiseOrValue<string | undefined>;
|
|
117
124
|
};
|
|
118
125
|
/**
|
|
119
126
|
* a prompt that can interface with a
|
package/dist/prompts/chat.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { Message, ContentPart, ModelMessage } from '../message.js';
|
|
|
5
5
|
import { IChatModel, TextChunkHandler } from '../models/chat.js';
|
|
6
6
|
import { Schema } from '../schema.js';
|
|
7
7
|
import { ITemplate } from '../template.js';
|
|
8
|
+
import { PromiseOrValue } from '../utils/types.js';
|
|
8
9
|
import { IAiPlugin } from './plugin.js';
|
|
9
10
|
import '../citation.js';
|
|
10
11
|
|
|
@@ -113,7 +114,13 @@ type ChatPromptPlugin<TPluginName extends string, TPluginUseArgs extends {}> = I
|
|
|
113
114
|
* @param functions
|
|
114
115
|
* @returns Functions
|
|
115
116
|
*/
|
|
116
|
-
onBuildFunctions?: (functions: Function[]) =>
|
|
117
|
+
onBuildFunctions?: (functions: Function[]) => PromiseOrValue<Function[]>;
|
|
118
|
+
/**
|
|
119
|
+
* Optionally passed in to modify the system prompt before it is sent to the model.
|
|
120
|
+
* @param systemPrompt The system prompt string (or undefined)
|
|
121
|
+
* @returns The modified system prompt string (or undefined)
|
|
122
|
+
*/
|
|
123
|
+
onBuildPrompt?: (systemPrompt: string | undefined) => PromiseOrValue<string | undefined>;
|
|
117
124
|
};
|
|
118
125
|
/**
|
|
119
126
|
* a prompt that can interface with a
|
package/dist/prompts/chat.js
CHANGED
|
@@ -109,7 +109,16 @@ class ChatPrompt {
|
|
|
109
109
|
const messages = !Array.isArray(options.messages) ? options.messages || this._messages : new localMemory.LocalMemory({ messages: options.messages || [] });
|
|
110
110
|
let buffer = "";
|
|
111
111
|
let system = void 0;
|
|
112
|
-
|
|
112
|
+
let prompt = await this._template.render();
|
|
113
|
+
for (const plugin of this.plugins) {
|
|
114
|
+
if (plugin.onBuildPrompt) {
|
|
115
|
+
const nextPrompt = await plugin.onBuildPrompt(prompt);
|
|
116
|
+
if (nextPrompt != null && nextPrompt !== prompt) {
|
|
117
|
+
this._log.debug(`Plugin "${plugin.name}" modified the system prompt`);
|
|
118
|
+
prompt = nextPrompt;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
113
122
|
if (prompt) {
|
|
114
123
|
system = {
|
|
115
124
|
role: this._role,
|
package/dist/prompts/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":["StringTemplate","LocalMemory","ConsoleLogger"],"mappings":"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","file":"chat.js","sourcesContent":["import { ConsoleLogger, ILogger } from '@microsoft/teams.common';\n\nimport { 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 /**\n * Logger instance to use for logging\n * If not provided, a ConsoleLogger will be used\n */\n logger?: ILogger;\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 * 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 protected readonly _log: ILogger;\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 this._log = options.logger || new ConsoleLogger(`@microsoft/teams.ai/prompts/${this._name}`);\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 this._log.debug(`Plugin \"${name}\" not found`);\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n this._log.debug(`Using plugin \"${name}\" with args:`, args);\n plugin.onUsePlugin(args);\n this._log.debug(`Successfully initialized plugin \"${name}\"`);\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 this._log.debug(`Processing plugins before send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n this._log.debug(`Running onBeforeSend for plugin \"${plugin.name}\"`);\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 this._log.debug('System instructions for LLM:', prompt);\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((acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n }, {} as Record<string, Function>);\n\n if (Object.keys(fnMap).length > 0) {\n this._log.debug(\n 'Available functions for LLM:',\n Object.keys(fnMap).map((name) => {\n const fn = fnMap[name];\n const paramDescriptions =\n 'properties' in fn.parameters && fn.parameters.properties\n ? Object.entries(\n fn.parameters.properties as Record<string, { description?: string }>\n ).reduce(\n (acc, [key, prop]) => ({\n ...acc,\n [key]: prop.description,\n }),\n {} as Record<string, string | undefined>\n )\n : {};\n\n return {\n name,\n description: fn.description,\n parameters: {\n schema: fn.parameters,\n descriptions: paramDescriptions,\n },\n };\n })\n );\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\n // Log function calls if present\n if (output.function_calls && output.function_calls.length > 0) {\n this._log.debug(\n 'LLM requested function calls:',\n output.function_calls.map((call) => ({\n name: call.name,\n id: call.id,\n arguments: call.arguments,\n }))\n );\n }\n\n this._log.debug(`Processing plugins after send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n this._log.debug(`Running onAfterSend for plugin \"${plugin.name}\"`);\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":["StringTemplate","LocalMemory","ConsoleLogger"],"mappings":"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","file":"chat.js","sourcesContent":["import { ConsoleLogger, ILogger } from '@microsoft/teams.common';\n\nimport { 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 { PromiseOrValue, 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 /**\n * Logger instance to use for logging\n * If not provided, a ConsoleLogger will be used\n */\n logger?: ILogger;\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 * 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[]) => PromiseOrValue<Function[]>;\n /**\n * Optionally passed in to modify the system prompt before it is sent to the model.\n * @param systemPrompt The system prompt string (or undefined)\n * @returns The modified system prompt string (or undefined)\n */\n onBuildPrompt?: (systemPrompt: string | undefined) => PromiseOrValue<string | undefined>;\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 protected readonly _log: ILogger;\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 this._log = options.logger || new ConsoleLogger(`@microsoft/teams.ai/prompts/${this._name}`);\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 this._log.debug(`Plugin \"${name}\" not found`);\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n this._log.debug(`Using plugin \"${name}\" with args:`, args);\n plugin.onUsePlugin(args);\n this._log.debug(`Successfully initialized plugin \"${name}\"`);\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 this._log.debug(`Processing plugins before send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n this._log.debug(`Running onBeforeSend for plugin \"${plugin.name}\"`);\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 let prompt = await this._template.render();\n\n for (const plugin of this.plugins) {\n if (plugin.onBuildPrompt) {\n const nextPrompt = await plugin.onBuildPrompt(prompt);\n if (nextPrompt != null && nextPrompt !== prompt) {\n this._log.debug(`Plugin \"${plugin.name}\" modified the system prompt`);\n prompt = nextPrompt;\n }\n }\n }\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n this._log.debug('System instructions for LLM:', prompt);\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((acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n }, {} as Record<string, Function>);\n\n if (Object.keys(fnMap).length > 0) {\n this._log.debug(\n 'Available functions for LLM:',\n Object.keys(fnMap).map((name) => {\n const fn = fnMap[name];\n const paramDescriptions =\n 'properties' in fn.parameters && fn.parameters.properties\n ? Object.entries(\n fn.parameters.properties as Record<string, { description?: string }>\n ).reduce(\n (acc, [key, prop]) => ({\n ...acc,\n [key]: prop.description,\n }),\n {} as Record<string, string | undefined>\n )\n : {};\n\n return {\n name,\n description: fn.description,\n parameters: {\n schema: fn.parameters,\n descriptions: paramDescriptions,\n },\n };\n })\n );\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\n // Log function calls if present\n if (output.function_calls && output.function_calls.length > 0) {\n this._log.debug(\n 'LLM requested function calls:',\n output.function_calls.map((call) => ({\n name: call.name,\n id: call.id,\n arguments: call.arguments,\n }))\n );\n }\n\n this._log.debug(`Processing plugins after send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n this._log.debug(`Running onAfterSend for plugin \"${plugin.name}\"`);\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
|
@@ -107,7 +107,16 @@ class ChatPrompt {
|
|
|
107
107
|
const messages = !Array.isArray(options.messages) ? options.messages || this._messages : new LocalMemory({ messages: options.messages || [] });
|
|
108
108
|
let buffer = "";
|
|
109
109
|
let system = void 0;
|
|
110
|
-
|
|
110
|
+
let prompt = await this._template.render();
|
|
111
|
+
for (const plugin of this.plugins) {
|
|
112
|
+
if (plugin.onBuildPrompt) {
|
|
113
|
+
const nextPrompt = await plugin.onBuildPrompt(prompt);
|
|
114
|
+
if (nextPrompt != null && nextPrompt !== prompt) {
|
|
115
|
+
this._log.debug(`Plugin "${plugin.name}" modified the system prompt`);
|
|
116
|
+
prompt = nextPrompt;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
111
120
|
if (prompt) {
|
|
112
121
|
system = {
|
|
113
122
|
role: this._role,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":[],"mappings":"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","file":"chat.mjs","sourcesContent":["import { ConsoleLogger, ILogger } from '@microsoft/teams.common';\n\nimport { 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 /**\n * Logger instance to use for logging\n * If not provided, a ConsoleLogger will be used\n */\n logger?: ILogger;\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 * 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 protected readonly _log: ILogger;\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 this._log = options.logger || new ConsoleLogger(`@microsoft/teams.ai/prompts/${this._name}`);\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 this._log.debug(`Plugin \"${name}\" not found`);\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n this._log.debug(`Using plugin \"${name}\" with args:`, args);\n plugin.onUsePlugin(args);\n this._log.debug(`Successfully initialized plugin \"${name}\"`);\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 this._log.debug(`Processing plugins before send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n this._log.debug(`Running onBeforeSend for plugin \"${plugin.name}\"`);\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 this._log.debug('System instructions for LLM:', prompt);\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((acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n }, {} as Record<string, Function>);\n\n if (Object.keys(fnMap).length > 0) {\n this._log.debug(\n 'Available functions for LLM:',\n Object.keys(fnMap).map((name) => {\n const fn = fnMap[name];\n const paramDescriptions =\n 'properties' in fn.parameters && fn.parameters.properties\n ? Object.entries(\n fn.parameters.properties as Record<string, { description?: string }>\n ).reduce(\n (acc, [key, prop]) => ({\n ...acc,\n [key]: prop.description,\n }),\n {} as Record<string, string | undefined>\n )\n : {};\n\n return {\n name,\n description: fn.description,\n parameters: {\n schema: fn.parameters,\n descriptions: paramDescriptions,\n },\n };\n })\n );\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\n // Log function calls if present\n if (output.function_calls && output.function_calls.length > 0) {\n this._log.debug(\n 'LLM requested function calls:',\n output.function_calls.map((call) => ({\n name: call.name,\n id: call.id,\n arguments: call.arguments,\n }))\n );\n }\n\n this._log.debug(`Processing plugins after send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n this._log.debug(`Running onAfterSend for plugin \"${plugin.name}\"`);\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/prompts/chat.ts"],"names":[],"mappings":"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","file":"chat.mjs","sourcesContent":["import { ConsoleLogger, ILogger } from '@microsoft/teams.common';\n\nimport { 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 { PromiseOrValue, 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 /**\n * Logger instance to use for logging\n * If not provided, a ConsoleLogger will be used\n */\n logger?: ILogger;\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 * 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[]) => PromiseOrValue<Function[]>;\n /**\n * Optionally passed in to modify the system prompt before it is sent to the model.\n * @param systemPrompt The system prompt string (or undefined)\n * @returns The modified system prompt string (or undefined)\n */\n onBuildPrompt?: (systemPrompt: string | undefined) => PromiseOrValue<string | undefined>;\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 protected readonly _log: ILogger;\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 this._log = options.logger || new ConsoleLogger(`@microsoft/teams.ai/prompts/${this._name}`);\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 this._log.debug(`Plugin \"${name}\" not found`);\n throw new Error(`Plugin \"${name}\" not found`);\n }\n\n if (plugin.onUsePlugin) {\n this._log.debug(`Using plugin \"${name}\" with args:`, args);\n plugin.onUsePlugin(args);\n this._log.debug(`Successfully initialized plugin \"${name}\"`);\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 this._log.debug(`Processing plugins before send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onBeforeSend) {\n this._log.debug(`Running onBeforeSend for plugin \"${plugin.name}\"`);\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 let prompt = await this._template.render();\n\n for (const plugin of this.plugins) {\n if (plugin.onBuildPrompt) {\n const nextPrompt = await plugin.onBuildPrompt(prompt);\n if (nextPrompt != null && nextPrompt !== prompt) {\n this._log.debug(`Plugin \"${plugin.name}\" modified the system prompt`);\n prompt = nextPrompt;\n }\n }\n }\n\n if (prompt) {\n system = {\n role: this._role,\n content: prompt,\n };\n this._log.debug('System instructions for LLM:', prompt);\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((acc, fn) => {\n acc[fn.name] = {\n ...fn,\n handler: (args: any) => this.executeFunction(fn.name, fn, args),\n };\n return acc;\n }, {} as Record<string, Function>);\n\n if (Object.keys(fnMap).length > 0) {\n this._log.debug(\n 'Available functions for LLM:',\n Object.keys(fnMap).map((name) => {\n const fn = fnMap[name];\n const paramDescriptions =\n 'properties' in fn.parameters && fn.parameters.properties\n ? Object.entries(\n fn.parameters.properties as Record<string, { description?: string }>\n ).reduce(\n (acc, [key, prop]) => ({\n ...acc,\n [key]: prop.description,\n }),\n {} as Record<string, string | undefined>\n )\n : {};\n\n return {\n name,\n description: fn.description,\n parameters: {\n schema: fn.parameters,\n descriptions: paramDescriptions,\n },\n };\n })\n );\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\n // Log function calls if present\n if (output.function_calls && output.function_calls.length > 0) {\n this._log.debug(\n 'LLM requested function calls:',\n output.function_calls.map((call) => ({\n name: call.name,\n id: call.id,\n arguments: call.arguments,\n }))\n );\n }\n\n this._log.debug(`Processing plugins after send (${this.plugins.length} plugins found)`);\n for (const plugin of this.plugins) {\n if (plugin.onAfterSend) {\n this._log.debug(`Running onAfterSend for plugin \"${plugin.name}\"`);\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/index.d.mts
CHANGED
package/dist/prompts/index.d.ts
CHANGED
package/dist/utils/types.d.mts
CHANGED
package/dist/utils/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microsoft/teams.ai",
|
|
3
|
-
"version": "2.0.0-preview.
|
|
3
|
+
"version": "2.0.0-preview.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"test": "npx jest"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@microsoft/teams.common": "2.0.0-preview.
|
|
37
|
+
"@microsoft/teams.common": "2.0.0-preview.4"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@microsoft/teams.config": "2.0.0-preview.
|
|
40
|
+
"@microsoft/teams.config": "2.0.0-preview.4",
|
|
41
41
|
"@types/jest": "^29.5.12",
|
|
42
42
|
"@types/node": "^22.0.2",
|
|
43
43
|
"jest": "^29.7.0",
|