@microsoft/teams.ai 2.0.0-preview.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -175,7 +175,7 @@ class ChatPrompt {
175
175
  messages,
176
176
  request: options.request,
177
177
  functions: fnMap,
178
- onChunk: async (chunk) => {
178
+ onChunk: onChunk ? async (chunk) => {
179
179
  if (!chunk || !onChunk) return;
180
180
  buffer += chunk;
181
181
  try {
@@ -184,7 +184,7 @@ class ChatPrompt {
184
184
  } catch (err) {
185
185
  return;
186
186
  }
187
- },
187
+ } : void 0,
188
188
  autoFunctionCalling: options.autoFunctionCalling
189
189
  }
190
190
  );
@@ -212,19 +212,24 @@ class ChatPrompt {
212
212
  return output;
213
213
  }
214
214
  async executeFunction(name, fn, args) {
215
- const processedArgs = args || {};
216
- for (const plugin of this.plugins) {
217
- if (plugin.onBeforeFunctionCall) {
218
- await plugin.onBeforeFunctionCall(name, processedArgs);
215
+ try {
216
+ const processedArgs = args || {};
217
+ for (const plugin of this.plugins) {
218
+ if (plugin.onBeforeFunctionCall) {
219
+ await plugin.onBeforeFunctionCall(name, processedArgs);
220
+ }
219
221
  }
220
- }
221
- let result = await fn.handler(processedArgs);
222
- for (const plugin of this.plugins) {
223
- if (plugin.onAfterFunctionCall) {
224
- result = await plugin.onAfterFunctionCall(name, processedArgs, result);
222
+ let result = await fn.handler(processedArgs);
223
+ for (const plugin of this.plugins) {
224
+ if (plugin.onAfterFunctionCall) {
225
+ result = await plugin.onAfterFunctionCall(name, processedArgs, result);
226
+ }
225
227
  }
228
+ return result;
229
+ } catch (e) {
230
+ this._log.error(e);
231
+ throw e;
226
232
  }
227
- return result;
228
233
  }
229
234
  }
230
235
 
@@ -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, SystemMessage, UserMessage } from '../message';\nimport { IChatModel } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './chat-types';\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 autoFunctionCalling: options.autoFunctionCalling,\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, SystemMessage, UserMessage } from '../message';\nimport { IChatModel } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './chat-types';\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: 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 } : undefined,\n autoFunctionCalling: options.autoFunctionCalling,\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 try {\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 } catch (e) {\n this._log.error(e);\n throw e;\n }\n }\n}\n"]}
@@ -173,7 +173,7 @@ class ChatPrompt {
173
173
  messages,
174
174
  request: options.request,
175
175
  functions: fnMap,
176
- onChunk: async (chunk) => {
176
+ onChunk: onChunk ? async (chunk) => {
177
177
  if (!chunk || !onChunk) return;
178
178
  buffer += chunk;
179
179
  try {
@@ -182,7 +182,7 @@ class ChatPrompt {
182
182
  } catch (err) {
183
183
  return;
184
184
  }
185
- },
185
+ } : void 0,
186
186
  autoFunctionCalling: options.autoFunctionCalling
187
187
  }
188
188
  );
@@ -210,19 +210,24 @@ class ChatPrompt {
210
210
  return output;
211
211
  }
212
212
  async executeFunction(name, fn, args) {
213
- const processedArgs = args || {};
214
- for (const plugin of this.plugins) {
215
- if (plugin.onBeforeFunctionCall) {
216
- await plugin.onBeforeFunctionCall(name, processedArgs);
213
+ try {
214
+ const processedArgs = args || {};
215
+ for (const plugin of this.plugins) {
216
+ if (plugin.onBeforeFunctionCall) {
217
+ await plugin.onBeforeFunctionCall(name, processedArgs);
218
+ }
217
219
  }
218
- }
219
- let result = await fn.handler(processedArgs);
220
- for (const plugin of this.plugins) {
221
- if (plugin.onAfterFunctionCall) {
222
- result = await plugin.onAfterFunctionCall(name, processedArgs, result);
220
+ let result = await fn.handler(processedArgs);
221
+ for (const plugin of this.plugins) {
222
+ if (plugin.onAfterFunctionCall) {
223
+ result = await plugin.onAfterFunctionCall(name, processedArgs, result);
224
+ }
223
225
  }
226
+ return result;
227
+ } catch (e) {
228
+ this._log.error(e);
229
+ throw e;
224
230
  }
225
- return result;
226
231
  }
227
232
  }
228
233
 
@@ -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, SystemMessage, UserMessage } from '../message';\nimport { IChatModel } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './chat-types';\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 autoFunctionCalling: options.autoFunctionCalling,\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, SystemMessage, UserMessage } from '../message';\nimport { IChatModel } from '../models';\nimport { Schema } from '../schema';\nimport { ITemplate } from '../template';\nimport { StringTemplate } from '../templates';\nimport { WithRequired } from '../utils/types';\n\nimport { ChatPromptOptions, ChatPromptPlugin, ChatPromptSendOptions, IChatPrompt } from './chat-types';\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: 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 } : undefined,\n autoFunctionCalling: options.autoFunctionCalling,\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 try {\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 } catch (e) {\n this._log.error(e);\n throw e;\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/teams.ai",
3
- "version": "2.0.0-preview.9",
3
+ "version": "2.0.0",
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.9"
37
+ "@microsoft/teams.common": "2.0.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@microsoft/teams.config": "2.0.0-preview.9",
40
+ "@microsoft/teams.config": "2.0.0",
41
41
  "@types/jest": "^29.5.12",
42
42
  "@types/node": "^22.0.2",
43
43
  "jest": "^29.7.0",