@microsoft/teams.ai 2.0.0-preview.8 → 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.
- package/dist/prompts/chat.js +17 -12
- package/dist/prompts/chat.js.map +1 -1
- package/dist/prompts/chat.mjs +17 -12
- package/dist/prompts/chat.mjs.map +1 -1
- package/package.json +3 -3
package/dist/prompts/chat.js
CHANGED
|
@@ -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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
|
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, 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"]}
|
package/dist/prompts/chat.mjs
CHANGED
|
@@ -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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
|
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
|
|
37
|
+
"@microsoft/teams.common": "2.0.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@microsoft/teams.config": "2.0.0
|
|
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",
|