@microsoft/teams-ai
Version:
SDK focused on building AI based applications for Microsoft Teams.
269 lines • 12.1 kB
TypeScript
/**
* @module teams-ai
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import { TurnContext } from 'botbuilder';
import * as actions from './actions';
import { Moderator } from './moderators/Moderator';
import { Planner } from './planners';
import { TurnState } from './TurnState';
/**
* Options for configuring the AI system.
* @template TState Type of the turn state.
*/
export interface AIOptions<TState extends TurnState> {
/**
* The planner to use for generating plans.
*/
planner: Planner<TState>;
/**
* Optional. The moderator to use for moderating input passed to the model and the output
* returned by the model.
*/
moderator?: Moderator<TState>;
/**
* Optional. Maximum number of actions to execute in a single turn.
* @remarks
* The default value is 25.
*/
max_actions?: number;
/**
* Optional. Maximum amount of time to spend executing a single turn in milliseconds.
* @remarks
* The default value is 300000 or 5 minutes.
*/
max_time?: number;
/**
* Optional. If true, the AI system will allow the planner to loop.
* @remarks
* The default value is `true`.
*
* Looping is needed for augmentations like `functions` and `monologue` where the LLM needs to
* see the result of the last action that was performed. The AI system will attempt to autodetect
* if it needs to loop so you generally don't need to worry about this setting.
*
* If you're using an augmentation like `sequence` you can set this to `false` to guard against
* any accidental looping.
*/
allow_looping?: boolean;
/**
* Optional. If true, the AI system will enable the feedback loop in Teams that allows a user to give thumbs up or down to a response. Default is `false`.
* @remarks
* At this time, there is no activity handler support in the Teams AI Library to handle when a user gives feedback.
* To make use of the feedback loop, use the app.feedbackLoop route registration.
* https://github.com/microsoft/teams-ai/blob/main/getting-started/CONCEPTS/POWERED-BY-AI.md
*/
enable_feedback_loop?: boolean;
/**
* Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input
* to provide feedback.
*/
feedback_loop_type?: 'default' | 'custom';
}
/**
* The configured options for the AI system after all defaults have been applied.
* @template TState Type of the turn state.
*/
export interface ConfiguredAIOptions<TState extends TurnState> {
/**
* The planner being used for generating plans.
*/
planner: Planner<TState>;
/**
* The moderator being used for moderating input passed to the model and the output
*/
moderator: Moderator<TState>;
/**
* Maximum number of actions to execute in a single turn.
*/
max_steps: number;
/**
* Maximum amount of time to spend executing a single turn in milliseconds.
*/
max_time: number;
/**
* If true, the AI system will allow the planner to loop.
*/
allow_looping: boolean;
/**
* If true, the AI system will enable the feedback loop in Teams that allows a user to give thumbs up or down to a response.
*/
enable_feedback_loop: boolean;
/**
* Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input
* to provide feedback.
*/
feedback_loop_type?: 'default' | 'custom';
}
/**
* AI System.
* @remarks
* The AI system is responsible for generating plans, moderating input and output, and
* generating prompts. It can be used free standing or routed to by the Application object.
* @template TState Optional. Type of the turn state.
*/
export declare class AI<TState extends TurnState = TurnState> {
private readonly _actions;
private readonly _options;
/**
* A text string that can be returned from an action to stop the AI system from continuing
* to execute the current plan.
* @remarks
* This command is incompatible and should not be used with `tools` augmentation
*/
static readonly StopCommandName = "STOP";
/**
* An action that will be called anytime an unknown action is predicted by the planner.
* @remarks
* The default behavior is to simply log an error to the console. The plan is allowed to
* continue execution by default.
*/
static readonly UnknownActionName = "___UnknownAction___";
/**
* An action that will be called anytime an input is flagged by the moderator.
* @remarks
* The default behavior is to simply log an error to the console. Override to send a custom
* message to the user.
*/
static readonly FlaggedInputActionName = "___FlaggedInput___";
/**
* An action that will be called anytime an output is flagged by the moderator.
* @remarks
* The default behavior is to simply log an error to the console. Override to send a custom
* message to the user.
*/
static readonly FlaggedOutputActionName = "___FlaggedOutput___";
/**
* An action that will be called anytime the planner encounters an HTTP response with
* status code >= `400`.
*/
static readonly HttpErrorActionName = "___HttpError___";
/**
* The task either executed too many steps or timed out.
*/
static readonly TooManyStepsActionName = "___TooManySteps___";
/**
* An action that will be called after the plan has been predicted by the planner and it has
* passed moderation.
* @remarks
* Overriding this action lets you customize the decision to execute a plan separately from the
* moderator. The default behavior is to proceed with the plans execution only with a plan
* contains one or more commands. Returning false from this action can be used to prevent the plan
* from being executed.
*/
static readonly PlanReadyActionName = "___PlanReady___";
/**
* An action that is called to DO an action.
* @remarks
* The action system is used to do other actions. Overriding this action lets you customize the
* execution of an individual action. You can use it to log actions being used or to prevent
* certain actions from being executed based on policy.
*
* The default behavior is to simply execute the action handler passed in so you will need to
* perform that logic yourself should you override this action.
*/
static readonly DoCommandActionName = "___DO___";
/**
* An action that is called to SAY something.
* @remarks
* Overriding this action lets you customize the execution of the SAY command. You can use it
* to log the output being generated or to add support for sending certain types of output as
* message attachments.
*
* The default behavior attempts to look for an Adaptive Card in the output and if found sends
* it as an attachment. If no Adaptive Card is found then the output is sent as a plain text
* message.
*
* If you override this action and want to automatically send Adaptive Cards as attachments you
* will need to handle that yourself.
*/
static readonly SayCommandActionName = "___SAY___";
/**
* Creates a new AI system.
* @param {ConfiguredAIOptions} options The options used to configure the AI system.
*/
constructor(options: AIOptions<TState>);
/**
* Returns the moderator being used by the AI system.
* @remarks
* The default moderator simply allows all messages and plans through without intercepting them.
* @returns {Moderator} The AI's moderator
*/
get moderator(): Moderator<TState>;
/**
* @returns {Planner<TState>} Returns the planner being used by the AI system.
*/
get planner(): Planner<TState>;
/**
* @returns {boolean} Returns the feedback loop flag.
*/
get enableFeedbackLoop(): boolean;
/**
* @returns {boolean} Returns the feedback loop type.
*/
get feedbackLoopType(): 'default' | 'custom' | undefined;
/**
* Registers a handler for a named action.
* @remarks
* The AI systems planner returns plans that are made up of a series of commands or actions
* that should be performed. Registering a handler lets you provide code that should be run in
* response to one of the predicted actions.
*
* Plans support a DO command which specifies the name of an action to call and an optional
* set of entities that should be passed to the action. The internal plan executor will call
* the registered handler for the action passing in the current context, state, and entities.
*
* Additionally, the AI system itself uses actions to handle things like unknown actions,
* flagged input, and flagged output. You can override these actions by registering your own
* handler for them. The names of the built-in actions are available as static properties on
* the AI class.
* @template TParameters Optional. The type of parameters that the action handler expects.
* @param {string | string[]} name Unique name of the action.
* @param {actions.ActionHandler} handler The code to execute when the action's name is triggered.
* @returns {this} The AI system instance for chaining purposes.
*/
action<TParameters extends Record<string, any> | undefined>(name: string | string[], handler: actions.ActionHandler<TState, TParameters>): this;
/**
* Registers the default handler for a named action.
* @remarks
* @param {string | string[]} name - Unique name of the action.
* @template TParameters - Optional. The type of parameters that the action handler expects.
* @param {actions.ActionHandler<TState, TParameters>} handler - The code to execute when the action's name is triggered.
* Default handlers can be replaced by calling the action() method with the same name.
* @returns {this} The AI system instance for chaining purposes.
*/
defaultAction<TParameters extends Record<string, any> | undefined>(name: string | string[], handler: actions.ActionHandler<TState, TParameters>): this;
/**
* Manually executes a named action.
* @template TParameters Optional. Type of entities expected to be passed to the action.
* @param {TurnContext} context Current turn context.
* @param {TState} state Current turn state.
* @param {string} action Name of the action to execute.
* @param {TParameters} parameters Optional. Entities to pass to the action.
* @returns {Promise<string>} The result of the action.
*/
doAction<TParameters = Record<string, any>>(context: TurnContext, state: TState, action: string, parameters?: TParameters): Promise<string>;
/**
* Checks to see if the AI system has a handler for a given action.
* @param {string} action Name of the action to check.
* @returns {boolean} True if the AI system has a handler for the given action.
*/
hasAction(action: string): boolean;
/**
* Calls the configured planner to generate a plan and executes the plan that is returned.
* @remarks
* The moderator is called to review the input and output of the plan. If the moderator flags
* the input or output then the appropriate action is called. If the moderator allows the input
* and output then the plan is executed.
* @param {TurnContext} context Current turn context.
* @param {TState} state Current turn state.
* @param {number} start_time Optional. Time the AI system started running
* @param {number} step_count Optional. Number of steps that have been executed.
* @returns {Promise<boolean>} True if the plan was completely executed, otherwise false.
*/
run(context: TurnContext, state: TState, start_time?: number, step_count?: number): Promise<boolean>;
}
//# sourceMappingURL=AI.d.ts.map