diff --git a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/RecognizerField.tsx b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/RecognizerField.tsx index d8bf399ea7..73f6c370a7 100644 --- a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/RecognizerField.tsx +++ b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/RecognizerField.tsx @@ -1,59 +1,160 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. /** @jsx jsx */ -import { jsx } from '@emotion/core'; -import React, { useMemo } from 'react'; +import { jsx, css } from '@emotion/core'; +import React, { useCallback, useMemo, useState, useEffect } from 'react'; import { FieldProps, useShellApi, useRecognizerConfig } from '@bfc/extension-client'; import { MicrosoftIRecognizer } from '@bfc/shared'; -import { Dropdown, ResponsiveMode, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; import formatMessage from 'format-message'; +import { Dialog, DialogFooter, DialogType } from 'office-ui-fabric-react/lib/Dialog'; +import { ScrollablePane, ScrollbarVisibility } from 'office-ui-fabric-react/lib/ScrollablePane'; +import { Link } from 'office-ui-fabric-react/lib/Link'; +import { CheckboxVisibility, DetailsList, SelectionMode, Selection } from 'office-ui-fabric-react/lib/DetailsList'; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; import { FieldLabel } from '../../FieldLabel'; import { useMigrationEffect } from './useMigrationEffect'; -import { mapDropdownOptionToRecognizerSchema } from './mappers'; -import { getDropdownOptions } from './getDropdownOptions'; +import { mapListItemsToRecognizerSchema } from './mappers'; +import { getDetailsListItems } from './getDetailsListItems'; +const recognizerStyle = css` + display: flex; + justify-content: space-between; + margin: 5px 0px 10px 0px; +`; +const AzureBlue = '#0078D4'; +const recognizerContainer = css` + position: relative; + height: 500px; + border-top: 1px solid #f3f2f1; + border-bottom: 1px solid #f3f2f1; +`; +const learnRecognizerUrl = 'https://docs.microsoft.com/en-us/composer/concept-dialog?tabs=v2x#recognizer'; + +export type RecognizerListItem = { + key: string; + text: string; + description: string; +}; export const RecognizerField: React.FC> = (props) => { const { value, id, label, description, uiOptions, required, onChange } = props; const { shellApi, ...shellData } = useShellApi(); const { telemetryClient } = shellApi; + const [showDialog, setShowDialog] = useState(false); + const [selectedRecognizer, setSelectedRecognizer] = useState(); useMigrationEffect(value, onChange); const { recognizers: recognizerConfigs, currentRecognizer } = useRecognizerConfig(); - const dropdownOptions = useMemo(() => getDropdownOptions(recognizerConfigs, shellData, shellApi), [ + const detailsListItems = useMemo(() => getDetailsListItems(recognizerConfigs, shellData, shellApi), [ recognizerConfigs, ]); const RecognizerEditor = currentRecognizer?.recognizerEditor; const widget = RecognizerEditor ? : null; - const submit = (_, option?: IDropdownOption): void => { - if (!option) return; + const selection = useMemo(() => { + return new Selection({ + onSelectionChanged: () => { + const selectedItems = selection.getSelection() as RecognizerListItem[]; + if (selectedItems?.length > 0) { + setSelectedRecognizer(selectedItems[0]); + } + }, + }); + }, [setSelectedRecognizer]); - const recognizerDefinition = mapDropdownOptionToRecognizerSchema(option, recognizerConfigs); + const submit = useCallback((): void => { + if (!selectedRecognizer) return; + + const recognizerDefinition = mapListItemsToRecognizerSchema(selectedRecognizer, recognizerConfigs); const seedNewRecognizer = recognizerDefinition?.seedNewRecognizer; const recognizerInstance = typeof seedNewRecognizer === 'function' ? seedNewRecognizer(shellData, shellApi) - : { $kind: option.key as string, intents: [] }; // fallback to default Recognizer instance; + : { $kind: selectedRecognizer.key as string, intents: [] }; // fallback to default Recognizer instance; onChange(recognizerInstance); - telemetryClient?.track('RecognizerChanged', { recognizer: option.key as string }); - }; + telemetryClient?.track('RecognizerChanged', { recognizer: selectedRecognizer.key as string }); + }, [selectedRecognizer, recognizerConfigs, shellData, shellApi]); + + useEffect(() => { + if (selection && currentRecognizer) { + selection.setItems(detailsListItems, false); + selection.setKeySelected(currentRecognizer.id, true, false); + } + }, [detailsListItems]); return ( - +
{formatMessage('Recognizer/Dispatch type')}
+
+ + {typeof currentRecognizer?.displayName === 'function' + ? currentRecognizer?.displayName({}) + : currentRecognizer?.displayName} + + setShowDialog(true)}> + {formatMessage('Change')} + +
+ {widget}
); diff --git a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDropdownOptions.ts b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDetailsListItems.ts similarity index 85% rename from Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDropdownOptions.ts rename to Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDetailsListItems.ts index 09fad911d5..cb85cacf57 100644 --- a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDropdownOptions.ts +++ b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/getDetailsListItems.ts @@ -5,7 +5,7 @@ import { RecognizerSchema, FallbackRecognizerKey, ShellApi, ShellData } from '@b import { checkForPVASchema } from '@bfc/shared'; import { recognizerOrderMap } from './defaultRecognizerOrder'; -import { mapRecognizerSchemaToDropdownOption } from './mappers'; +import { mapRecognizerSchemaToListItems } from './mappers'; const getRankScore = (r: RecognizerSchema, shellData: ShellData, shellApi: ShellApi) => { // Always put disabled recognizer behind. Handle 'disabled' before 'default'. @@ -17,7 +17,7 @@ const getRankScore = (r: RecognizerSchema, shellData: ShellData, shellApi: Shell return recognizerOrderMap[r.id] ?? Number.MAX_VALUE - 1; }; -export const getDropdownOptions = (configs: RecognizerSchema[], shellData: ShellData, shellApi: ShellApi) => { +export const getDetailsListItems = (configs: RecognizerSchema[], shellData: ShellData, shellApi: ShellApi) => { const isPVASchema = checkForPVASchema(shellData.schemas?.sdk); let recognizerConfigs: RecognizerSchema[] = configs; if (isPVASchema) { @@ -31,5 +31,5 @@ export const getDropdownOptions = (configs: RecognizerSchema[], shellData: Shell .sort((r1, r2) => { return getRankScore(r1, shellData, shellApi) - getRankScore(r2, shellData, shellApi); }) - .map(mapRecognizerSchemaToDropdownOption); + .map(mapRecognizerSchemaToListItems); }; diff --git a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/mappers.ts b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/mappers.ts index 47c629af22..cbee5179d2 100644 --- a/Composer/packages/adaptive-form/src/components/fields/RecognizerField/mappers.ts +++ b/Composer/packages/adaptive-form/src/components/fields/RecognizerField/mappers.ts @@ -2,14 +2,16 @@ // Licensed under the MIT License. import { RecognizerSchema } from '@bfc/extension-client'; -import { IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; -export const mapDropdownOptionToRecognizerSchema = (option: IDropdownOption, recognizerConfigs: RecognizerSchema[]) => { - return recognizerConfigs.find((r) => r.id === option.key); +import { RecognizerListItem } from './RecognizerField'; + +export const mapListItemsToRecognizerSchema = (item: RecognizerListItem, recognizerConfigs: RecognizerSchema[]) => { + return recognizerConfigs.find((r) => r.id === item.key); }; -export const mapRecognizerSchemaToDropdownOption = (recognizerSchema: RecognizerSchema): IDropdownOption => { - const { id, displayName } = recognizerSchema; +export const mapRecognizerSchemaToListItems = (recognizerSchema: RecognizerSchema) => { + const { id, displayName, description } = recognizerSchema; const recognizerName = typeof displayName === 'function' ? displayName({}) : displayName; - return { key: id, text: recognizerName || id }; + const recognizerDescription = typeof description === 'function' ? description({}) : description; + return { key: id, text: recognizerName || id, description: recognizerDescription }; }; diff --git a/Composer/packages/adaptive-form/src/components/fields/__tests__/RecognizerField.test.tsx b/Composer/packages/adaptive-form/src/components/fields/__tests__/RecognizerField.test.tsx index 18b9bc371c..3ffe676707 100644 --- a/Composer/packages/adaptive-form/src/components/fields/__tests__/RecognizerField.test.tsx +++ b/Composer/packages/adaptive-form/src/components/fields/__tests__/RecognizerField.test.tsx @@ -2,7 +2,7 @@ // Licensed under the MIT License. import React from 'react'; -import { render, fireEvent, screen } from '@botframework-composer/test-utils'; +import { render, fireEvent, screen, getAllByText } from '@botframework-composer/test-utils'; import { useRecognizerConfig, useShellApi } from '@bfc/extension-client'; import assign from 'lodash/assign'; @@ -37,12 +37,14 @@ describe('', () => { { id: 'one', displayName: 'One Recognizer', + description: 'test1', isSelected: () => false, seedNewRecognizer: handleChange, }, { id: 'two', displayName: 'Two Recognizer', + description: 'test2', isSelected: () => true, seedNewRecognizer: jest.fn(), }, @@ -51,12 +53,17 @@ describe('', () => { recognizers, currentRecognizer: recognizers[1], }); - const { getByTestId } = renderSubject({ value: { $kind: 'two' } }); - const dropdown = getByTestId('recognizerTypeDropdown'); - expect(dropdown).toHaveTextContent('Two Recognizer'); - fireEvent.click(dropdown); + const { getByText, getAllByText } = renderSubject({ value: { $kind: 'two' } }); + // two recognizer already choosed + expect(getByText('Two Recognizer')).not.toBeNull(); + + // click change recognizer, pop up dialog + fireEvent.click(getByText('Change')); + expect(getByText('One Recognizer')).not.toBeNull(); + expect(getAllByText('Two Recognizer').length).toBe(2); fireEvent.click(screen.getByText('One Recognizer')); + fireEvent.click(screen.getByText('Done')); expect(handleChange).toHaveBeenCalled(); }); }); diff --git a/Composer/packages/client/__tests__/plugins.test.ts b/Composer/packages/client/__tests__/plugins.test.ts index 24c9624991..4b4cb2b954 100644 --- a/Composer/packages/client/__tests__/plugins.test.ts +++ b/Composer/packages/client/__tests__/plugins.test.ts @@ -53,7 +53,7 @@ describe('mergePluginConfigs', () => { const config1 = { uiSchema: { [SDKKinds.RegexRecognizer]: { - recognizer: { displayName: 'recognizer1' }, + recognizer: { displayName: 'recognizer1', description: 'recognizer1' }, }, }, }; @@ -61,17 +61,17 @@ describe('mergePluginConfigs', () => { const config2 = { uiSchema: { [SDKKinds.LuisRecognizer]: { - recognizer: { displayName: 'recognizer2' }, + recognizer: { displayName: 'recognizer2', description: 'recognizer2' }, }, }, }; expect(mergePluginConfigs(config1, config2).uiSchema).toEqual({ [SDKKinds.RegexRecognizer]: { - recognizer: { displayName: 'recognizer1' }, + recognizer: { displayName: 'recognizer1', description: 'recognizer1' }, }, [SDKKinds.LuisRecognizer]: { - recognizer: { displayName: 'recognizer2' }, + recognizer: { displayName: 'recognizer2', description: 'recognizer2' }, }, }); }); diff --git a/Composer/packages/extension-client/src/types/formSchema.ts b/Composer/packages/extension-client/src/types/formSchema.ts index 7588e3aa41..95e63550ec 100644 --- a/Composer/packages/extension-client/src/types/formSchema.ts +++ b/Composer/packages/extension-client/src/types/formSchema.ts @@ -82,6 +82,8 @@ export type RecognizerSchema = { disabled?: boolean | ((shellData: ShellData, shellApi: ShellApi) => boolean); /** Display name used in the UI. Recommended to use function over static string to enable multi-locale feature. */ displayName: UIOptionValue; + /** Description used in the UI. describe the usage of this recognizer */ + description: UIOptionValue; /** An inline editor to edit an intent. If none provided, users will not be able to edit. */ intentEditor?: FieldWidget | string; /** A function invoked with the form data to determine if this is the currently selected recognizer */ diff --git a/Composer/packages/integration-tests/cypress/integration/DesignPage.spec.ts b/Composer/packages/integration-tests/cypress/integration/DesignPage.spec.ts index 100abd63ed..8b90857da8 100644 --- a/Composer/packages/integration-tests/cypress/integration/DesignPage.spec.ts +++ b/Composer/packages/integration-tests/cypress/integration/DesignPage.spec.ts @@ -73,8 +73,10 @@ context('breadcrumb', () => { it('can create different kinds of triggers ', () => { cy.visitPage('Create'); cy.findByTestId('DialogHeader-TestBot_TestSample').click(); - cy.findByTestId('recognizerTypeDropdown').click(); - cy.findByText('Regular expression recognizer').click(); + // cy.findByText('Change').click(); + cy.findByTestId('openRecognizerDialog').click(); + cy.findByText('Regular expression').click(); + cy.findByText('Done').click(); //onintent trigger cy.findByTestId('DialogHeader-TestBot_TestSample').within(() => { diff --git a/Composer/packages/server/src/locales/en-US.json b/Composer/packages/server/src/locales/en-US.json index 4bba37b224..72ea8a8435 100644 --- a/Composer/packages/server/src/locales/en-US.json +++ b/Composer/packages/server/src/locales/en-US.json @@ -251,6 +251,9 @@ "add_qna_pair_16c228f0": { "message": "+ Add QnA Pair" }, + "add_regex_pattern_140335cb": { + "message": "Add regex pattern" + }, "add_row_7ebc94fb": { "message": "Add row" }, @@ -258,7 +261,7 @@ "message": "> add some example phrases to trigger this intent:\n> - please tell me the weather\n> - what is the weather like in '{'city=Seattle'}'\n\n> entity definitions:\n> @ ml city" }, "add_some_expected_user_responses_please_remind_me__31dc5c07": { - "message": "> add some expected user responses:\n> - Please remind me to '{'itemTitle=buy milk'}'\n> - remind me to '{'itemTitle'}'\n> - add '{'itemTitle'}' to my todo list\n>\n> entity definitions:\n> @ ml itemTitle\n" + "message": "> add some expected user responses:\n > - Please remind me to '{'itemTitle=buy milk'}'\n > - remind me to '{'itemTitle'}'\n > - add '{'itemTitle'}' to my todo list\n >\n > entity definitions:\n > @ ml itemTitle\n " }, "add_suggested_action_baf855ca": { "message": "Add suggested action" @@ -695,6 +698,9 @@ "carousel_a2321ac9": { "message": "Carousel" }, + "change_dcaa253a": { + "message": "Change" + }, "change_recognizer_3145b93d": { "message": "Change Recognizer" }, @@ -710,6 +716,9 @@ "choose_a_location_for_your_new_bot_project_e979f2d5": { "message": "Choose a location for your new bot project." }, + "choose_a_recognizer_type_fa398753": { + "message": "Choose a recognizer type" + }, "choose_a_valid_publish_profile_to_continue_d4bd0b96": { "message": "Choose a valid publish profile to continue" }, @@ -1040,15 +1049,15 @@ "current_40c0812f": { "message": " - Current" }, + "custom_6979cd81": { + "message": "Custom" + }, "custom_actions_5d396747": { "message": "Custom Actions" }, "custom_events_d6f0e45b": { "message": "Custom events" }, - "custom_recognizer_951bab90": { - "message": "Custom recognizer" - }, "custom_runtime_426aa34f": { "message": "Custom runtime" }, @@ -1094,15 +1103,15 @@ "debugging_options_20e2e9da": { "message": "Debugging options" }, + "default_9db103d": { + "message": "Default" + }, "default_language_486a558d": { "message": "Default language" }, "default_language_a976938d": { "message": "DEFAULT LANGUAGE" }, - "default_recognizer_9c06c1a3": { - "message": "Default recognizer" - }, "define_conversation_objective_146d1cc6": { "message": "Define conversation objective" }, @@ -1421,6 +1430,9 @@ "enables_creating_bots_from_local_templates_as_well_5608165d": { "message": "Enables creating bots from local templates as well as creating bots from older versions of published templates" }, + "enables_you_to_customize_your_own_recognizer_by_ed_c79b2f3b": { + "message": "Enables you to customize your own recognizer by editing JSON in the form" + }, "end_dialog_88fa2f7a": { "message": "End dialog" }, @@ -1799,6 +1811,18 @@ "github_c7cc3613": { "message": "GitHub" }, + "gives_your_bot_the_ability_to_detect_and_route_use_663cf67d": { + "message": "Gives your bot the ability to detect and route user input to an appropriate skill or to a subsequent language understanding models." + }, + "gives_your_bot_the_ability_to_extract_intent_and_e_8170cf3d": { + "message": "Gives your bot the ability to extract intent and entity data from an utterance based on luis modal" + }, + "gives_your_bot_the_ability_to_extract_intent_and_e_b33162e7": { + "message": "Gives your bot the ability to extract intent and entity data from an utterance based on regular expression patterns." + }, + "gives_your_bot_the_ability_to_extract_intent_and_e_c315fe1d": { + "message": "Gives your bot the ability to extract intent and entity data from an utterance based on a cross trained recognizer set." + }, "go_to_qna_all_up_view_page_d475333d": { "message": "Go to QnA all-up view page." }, @@ -2123,6 +2147,9 @@ "learn_more_about_orchestrator_c070e031": { "message": "Learn more about Orchestrator" }, + "learn_more_about_recognizers_e58eb215": { + "message": "Learn more about recognizers" + }, "learn_more_about_skill_manifests_7708ce2c": { "message": "Learn more about skill manifests" }, @@ -2690,8 +2717,8 @@ "orchestrator_downloading_language_model_e785be44": { "message": "Orchestrator: Downloading language model" }, - "orchestrator_recognizer_cf38b65a": { - "message": "Orchestrator recognizer" + "orchestrator_intents_only_57c08345": { + "message": "Orchestrator (Intents only)" }, "origin_lg_file_not_found_in_store_d194cdbc": { "message": "origin lg file not found in store" @@ -2996,8 +3023,8 @@ "recent_f19e8c64": { "message": "Recent" }, - "recognizer_type_dc591e16": { - "message": "Recognizer Type" + "recognizer_dispatch_type_309452a6": { + "message": "Recognizer/Dispatch type" }, "recognizers_cefce9d1": { "message": "Recognizers" @@ -3023,12 +3050,12 @@ "region_939f2a6c": { "message": "Region" }, + "regular_expression_ca08546f": { + "message": "Regular expression" + }, "regular_expression_entity_e1cb91ce": { "message": "Regular expression entity" }, - "regular_expression_recognizer_44664557": { - "message": "Regular expression recognizer" - }, "release_1af20f26": { "message": "Release: " }, @@ -3509,8 +3536,8 @@ "specify_a_name_and_description_for_your_new_dialog_86eb3130": { "message": "Specify a name and description for your new dialog." }, - "specify_a_name_description_and_location_for_your_n_667f1438": { - "message": "Specify a name, description, and location for your new bot project." + "specify_a_name_runtime_type_and_location_for_your__594518ca": { + "message": "Specify a name, runtime type, and location for your new bot project." }, "specify_an_attachment_layout_when_there_are_more_t_28ffc0c2": { "message": "Specify an attachment layout when there are more than one." @@ -3677,6 +3704,9 @@ "the_azure_bot_created_in_azure_bot_services_contai_6a71ef26": { "message": "The Azure Bot created in Azure Bot Services contains bot resources that can be used as the basis for a new bot, or to add or replace resources of an existing bot." }, + "the_bot_is_already_part_of_the_bot_project_ab3250b1": { + "message": "The bot is already part of the Bot Project" + }, "the_bot_responses_page_is_where_the_language_gener_31a6666b": { "message": "The Bot Responses page is where the Language Generation (LG) editor locates. From here users can view all the LG templates and edit them." }, @@ -3818,6 +3848,9 @@ "this_option_allows_your_users_to_give_multiple_val_d2dd0d58": { "message": "This option allows your users to give multiple values for this property." }, + "this_path_does_not_exist_42c11e1": { + "message": "This path does not exist" + }, "this_project_was_created_in_an_older_version_of_co_8b57954": { "message": "This project was created in an older version of Composer. To open this project in Composer 2.0, we must copy your project and convert it to the latest format. Your original project will not be changed." }, @@ -3866,8 +3899,8 @@ "to_create_a_bot_from_your_own_bot_framework_templa_2c5b1f2d": { "message": "To create a bot from your own Bot Framework Template you need to add a path to your local templates index.js file. Learn more" }, - "to_ensure_a_secure_connection_provide_the_app_id_o_6aaaba6": { - "message": "To ensure a secure connection, provide the App ID of the bots that can connect to your skill. If you don’t have this information, you can also add this information in Skill Configuration. Learn more." + "to_ensure_a_secure_connection_provide_the_app_id_o_61ccd30d": { + "message": "To ensure a secure connection, provide the App ID of the bots that can connect to your skill. If you don’t have this information, you can also add this information in Skill Configuration." }, "to_ensure_a_secure_connection_the_remote_skill_nee_f382d684": { "message": "To ensure a secure connection, the remote skill needs to know the Microsoft App ID of your bot. " diff --git a/Composer/packages/ui-plugins/composer/src/defaultRecognizerSchema.ts b/Composer/packages/ui-plugins/composer/src/defaultRecognizerSchema.ts index 7d9e6f642d..d20bf7003b 100644 --- a/Composer/packages/ui-plugins/composer/src/defaultRecognizerSchema.ts +++ b/Composer/packages/ui-plugins/composer/src/defaultRecognizerSchema.ts @@ -7,14 +7,19 @@ import formatMessage from 'format-message'; import { RegexIntentField, CustomRecognizerField } from '@bfc/adaptive-form'; const FallbackRecognizerJsonEditor: RecognizerOptions = { - displayName: () => formatMessage('Custom recognizer'), + displayName: () => formatMessage('Custom'), seedNewRecognizer: () => ({}), recognizerEditor: CustomRecognizerField, + description: () => formatMessage('Enables you to customize your own recognizer by editing JSON in the form'), }; export const DefaultRecognizerSchema: RecognizerUISchema = { [SDKKinds.RegexRecognizer]: { - displayName: () => formatMessage('Regular expression recognizer'), + displayName: () => formatMessage('Regular expression'), + description: () => + formatMessage( + 'Gives your bot the ability to extract intent and entity data from an utterance based on regular expression patterns.' + ), intentEditor: RegexIntentField, renameIntent: (intentName, newIntentName, shellData, shellApi) => { const { currentDialog } = shellData; diff --git a/Composer/packages/ui-plugins/cross-trained/src/index.ts b/Composer/packages/ui-plugins/cross-trained/src/index.ts index 20f0632514..a6f1e8fe24 100644 --- a/Composer/packages/ui-plugins/cross-trained/src/index.ts +++ b/Composer/packages/ui-plugins/cross-trained/src/index.ts @@ -9,7 +9,11 @@ const config: PluginConfig = { uiSchema: { [SDKKinds.CrossTrainedRecognizerSet]: { recognizer: { - displayName: () => formatMessage('Default recognizer'), + displayName: () => formatMessage('Default'), + description: () => + formatMessage( + 'Gives your bot the ability to extract intent and entity data from an utterance based on a cross trained recognizer set.' + ), isSelected: (data, dialog: DialogInfo) => { if (dialog.luProvider === SDKKinds.OrchestratorRecognizer) return false; return typeof data === 'string' && data.endsWith('.lu.qna'); diff --git a/Composer/packages/ui-plugins/luis/src/index.ts b/Composer/packages/ui-plugins/luis/src/index.ts index e653d0ac38..c27a1b396d 100644 --- a/Composer/packages/ui-plugins/luis/src/index.ts +++ b/Composer/packages/ui-plugins/luis/src/index.ts @@ -18,6 +18,10 @@ const config: PluginConfig = { recognizer: { disabled: true, displayName: () => formatMessage('LUIS'), + description: () => + formatMessage( + 'Gives your bot the ability to extract intent and entity data from an utterance based on luis modal' + ), intentEditor: 'LuIntentEditor', isSelected: (data) => { return typeof data === 'string' && data.endsWith('.lu'); diff --git a/Composer/packages/ui-plugins/orchestrator/src/index.ts b/Composer/packages/ui-plugins/orchestrator/src/index.ts index cc7947d598..723a47e484 100644 --- a/Composer/packages/ui-plugins/orchestrator/src/index.ts +++ b/Composer/packages/ui-plugins/orchestrator/src/index.ts @@ -16,7 +16,11 @@ const config: PluginConfig = { } return !checkForOrchestratorSchema(shellData.schemas?.sdk); }, - displayName: () => formatMessage('Orchestrator recognizer'), + displayName: () => formatMessage('Orchestrator (Intents only)'), + description: () => + formatMessage( + 'Gives your bot the ability to detect and route user input to an appropriate skill or to a subsequent language understanding models.' + ), isSelected: (_, dialog: DialogInfo) => { return dialog.luProvider === SDKKinds.OrchestratorRecognizer; },