Propiedad Metadata en componentes de respuesta comunes

La propiedad Metadata se utiliza en los componentes de respuesta común para definir cómo se mostrarán los mensajes a los usuarios.

Los metadatos se definen en dos niveles: en el nivel raíz, donde se definen la salida y las acciones específicas del componente en sí, y en el nivel de respuesta, donde se define la visualización y el comportamiento particulares de los mensajes de texto, lista, tarjeta o anexo que genera este componente.
metadata:
  responseItems:
  - text: "To which location do you want the pizza to be delivered?"
    type: "text"
    name: "What location"
    separateBubbles: true
  globalActions:
  - label: "Send Location"
    type: "location"
    name: "SendLocation"
Propiedad Descripción ¿Obligatoria?
responseItems Lista de elementos de respuesta, cada uno de los cuales genera un nuevo mensaje enviado al cliente de chat (o varios mensajes si se define la iteración para el elemento de respuesta mediante la propiedad iteratorVariable o una combinación de las propiedades iteratorVariable y iteratorExpression). Defina estos elementos de respuesta con estos valores:
  • text: burbujas de texto (propiedad text) que pueden incluir una lista de botones que normalmente se muestran como botones.

    Para entidades de bolsa compuesta (lo que significa que la propiedad variable designa una variable de entidad de bolsa compuesta), puede utilizar una petición de datos de expresión de FreeMarker para un valor de la entidad actual (“${system.entityToResolve.value.prompt}”).

  • cards: serie de tarjetas que se desplazan horizontalmente o verticalmente.

  • attachment: imagen, audio, vídeo o anexo que los usuarios pueden cargar o descargar.

  • editForm: formulario interactivo.
  • form
  • dataSet
globalActions Lista de acciones globales, lo que significa que no son específicas de ningún elemento de respuesta. Estas acciones normalmente se muestran en la parte inferior de la ventana de chat. En Facebook Messenger, por ejemplo, estas opciones se denominan respuestas rápidas. No
keywords Lista de palabras clave que coinciden con las palabras clave introducidas por un usuario para una carga útil de devolución correspondiente. Las palabras clave soportan canales de solo texto donde los botones de acción no se representan bien. No
También puede configurar los metadatos de los distintos elementos de respuesta, como los mensajes de texto, tarjeta o anexo.
Propiedad Descripción ¿Obligatoria?
type Tipo de elemento de respuesta que determina el formato del mensaje. Puede definir un mensaje como text, attachment o cards.
name Nombre del elemento de respuesta que se utiliza internamente, no se utiliza durante la ejecución. No
iteratorVariable Agrega de manera dinámica varios elementos de texto, anexo o palabras clave a la respuesta mediante la iteración en los elementos de la variable. No
iteratorExpression Expresión FreeMarker utilizada para mostrar valores de una matriz anidada dentro de la variable especificada por la propiedad iteratorVariable.

Por ejemplo, si ha definido el valor de la propiedad iteratorVariable en "team" y esa variable tiene un elemento denominado members del que desea mostrar los valores, debe utilizar la expresión ${team.value.members}.

No
visible Determina cómo se muestran los mensajes por canal y entrada de usuario. Consulte Propiedad visible. No
rangeStart Si ha especificado iteratorVariable, puede eliminar un subconjunto de elementos de respuesta especificando la propiedad rangeStart en combinación con la propiedad rangeSize. Puede introducir un valor codificado o utilizar una expresión FreeMarker que haga referencia a una variable de flujo de diálogo que contenga el inicio del rango. Mediante una variable rangeStart, puede definir la variable rangeStart en la carga útil de la opción Examinar para acceder al siguiente juego de datos. Puede ver un ejemplo de las propiedades rangeStart y rangeSize en el estado OrderPizza de CrcPizzaBot. No
rangeSize Número de elementos de respuesta que se mostrarán según lo especificado por las propiedades iteratorVariable y rangeStart. No
channelCustomProperties Lista de propiedades que disparan funciones concretas de un canal. Debido a que estas funciones son específicas de la plataforma, están fuera del componente de respuesta común y, por lo tanto, no se pueden controlar mediante las propiedades de nivel raíz o de nivel de elemento de respuesta del componente. Puede encontrar un ejemplo de esta propiedad en el estado OrderPizza de CrcPizzaBot.
channelCustomProperties:
          - channel: "facebook"
            properties:
              top_element_style: "large"
Para obtener detalles sobre el uso de channelCustomProperties, así como sobre las propiedades disponibles para cada canal, consulte Extensiones específicas del canal.
No

Propiedades de Metadatos de Palabra Clave

Puede crear accesos directos para las acciones definiendo las propiedades keyword y label. Así, por ejemplo, los usuarios pueden introducir S para Small.

El siguiente fragmento muestra cómo puede tener un juego de palabras clave generado a partir de una variable pizzaSize que contiene la lista de valores definidos para una entidad PizzaSize.
      
responseItems:         
- type: "text"  
  text: "What size of pizza do you want?" 
  actions: 
  - label: "(${enumValue[0]?upper_case})${enumValue?keep_after(enumValue[0])}"
    type: "postback"
    keyword: "${enumValue[0]?upper_case},${(enumValue?index)+1}"
    payload: 
      variables: 
        pizzaSize: "${enumValue}" 
    iteratorVariable: "pizzaSize.type.enumValues"
Propiedad Descripción ¿Obligatoria?
keyword Lista de palabras clave que disparan la carga útil de devolución definida por la propiedad payload. Puede utilizar una expresión de FreeMarker para devolver las palabras clave que la propiedad interatorVariable genera a partir de entidades de la lista de valores mediante las propiedades type y enumValues (iteratorVariable: "pizzaSize.type.enumValues").
label Etiqueta de la acción, que puede ser una cadena de texto o una expresión de Apache FreeMarker. Por ejemplo, esta es una expresión que indica una palabra clave de dos letras:

label: "(${enumValue[0]?upper_case}${enumValue[1]?upper_case})${enumValue?keep_after(enumValue[1])}"

Para obtener soporte multilingüe, utilice una expresión de Apache FreeMarker que haga referencia a un grupo de recursos.
No
skipAutoNumber Establézcala en true para suprimir la numeración automática de un elemento clave cuando Activar numeración automática en tarjetas se haya establecido en el asistente digital o en el nivel de aptitud. No
visible Determina cómo se muestran los mensajes de texto por canal y por entrada de usuario. Consulte Propiedad visible No
iteratorVariable Agrega de forma dinámica varias palabras clave iterando sobre los elementos almacenados en la variable especificada. Por ejemplo, iteratorVariable: "pizzaSize.type.enumValues". No
iteratorExpression Expresión FreeMarker utilizada para mostrar valores de una matriz anidada dentro de la variable especificada por la propiedad iteratorVariable.

Por ejemplo, si ha definido el valor de la propiedad iteratorVariable en "team" y esa variable tiene un elemento denominado members del que desea mostrar los valores, debe utilizar la expresión ${team.value.members}.

payload Carga útil de devolución, que tiene las siguientes propiedades.
  • action: acción de destino.
  • <variable names>: define valores para variables.
Debe definir, al menos, una de estas propiedades. Consulte Propiedades de la carga útil.
 

Extracción de palabras clave de los mensajes

Si bien el componente dispara una acción de devolución cuando los usuarios introducen un número, se puede ampliar la aptitud para admitir entradas más libres, como First, o let's try the 1st item. Para ello, cree una variable de matriz para las frases clave (por ejemplo, primero,1er,uno, segundo, 2o, dos, etc.).

A continuación, haga referencia a la variable en la propiedad keyword de los metadatos. Por ejemplo, esto es lo que podría parecer en un flujo para pedir una pizza.
- keyword: "${pizzas.name},<#if pizzas?index <KEYWORDS_VAR.value?size>${numberKeywords.value[pizzas?index].keywords}</#if>,<#if pizzas?index==cardsRangeStart?number+[cardsRangeStart?number+3,pizzaCount.value?number-cardsRangeStart?number-1]?min>last</#if>"
En esta definición, la última palabra clave se basa en el inicio del rango actual. Se define en la última pizza mostrada actualmente, en función del número de veces que el cliente ha introducido "more".

La propiedad visible

Utilice la propiedad opcional visible para definir la visualización según la entrada de usuario y el canal.
Propiedad Descripción ¿Obligatoria?
expression La directiva de Apache FreeMarker que muestra u oculta texto, tarjetas o anexos condicionalmente. Por ejemplo, el estado OrderPizza de CrcPizzaBot utiliza ""<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>" No
channels:
 include:
 exclude:
Para include y exclude, introduzca una lista separada por comas de los tipos de canal para los que se deben mostrar (include) u ocultar (exclude) el texto, la tarjeta o el anexo. Los valores del canal válidos son:
  • facebook

  • webhook

  • websdk

  • androidsdk

  • iossdk

  • twilio

  • slack

  • msteams

  • cortana

  • test

metadata:
  responseItems:
  - type: "text"
    text: "This text is only shown in Facebook Messenger"
    visible:
      channels:
        include: "facebook"             
  - type: "text"
    text: "This text is NOT shown in Facebook Messenger and Twilio"
    visible:
      channels:
        exclude: "facebook, twilio"
    actions:
    - label: "This action is only shown on web channel"
      type: "postback"
      payload:
        action: "someAction"
      visible:
        channels:
          include: "websdk"
No
onInvalidUserInput Indicador booleano que muestra el elemento de texto o anexo cuando el usuario introduce una entrada válida (value=false) o cuando el usuario introduce una entrada que no es válida (value=true). No
onDisambiguation Cuando true, solo muestra el elemento de respuesta, la tarjeta o la acción cuando se muestra una petición de datos de desambiguación. No
entitiesToResolve Utilice esta propiedad para crear un mensaje personalizado para cada elemento de bolsa compuesta. Agregue una lista delimitada por comas de nombres de elementos de bolsa compuesta para los que se debe mostrar el elemento de respuesta (include) u oculto (exclude).
visible:
           entitiesToResolve:
           include: "Amount"
No

Propiedades de metadatos de acción

Puede definir acciones para una tarjeta o lista, un tipo de respuesta o acciones globales para un componente (como acciones de respuesta rápida de Facebook). No se pueden configurar acciones para los mensajes de anexo.

Propiedad Descripción ¿Obligatoria?
type Tipo de acción:
  • postback: devuelve un objeto JSON que contiene el estado, la acción y las variables.

  • share: abre un cuadro de diálogo para compartir en el cliente de mensajería, lo que permite a los usuarios compartir burbujas de mensajes con sus amigos.

  • call: llama al número de teléfono especificado en la carga útil.

  • url: abre el URL especificado en la carga útil del explorador. Para Facebook Messenger, puede especificar la propiedad channelCustomProperties con webview_height_ratio, messenger_extensions y fallback_url.

  • location: envía la ubicación actual. En Facebook Messenger, no se admite la ubicación actual para las respuestas de texto o tarjeta. Solo se admite si se utiliza una respuesta rápida. Para obtener más información, consulte la documentación de la plataforma Facebook Messenger.

label Etiqueta para la acción. Para localizar esta etiqueta, puede utilizar una expresión de FreeMarker para hacer referencia a una entrada del grupo de recursos del bot.
iteratorVariable Esta opción se usa para agregar varias acciones iterando sobre los elementos almacenados en la variable especificada. No se puede usar esta propiedad con las acciones share y location. No
iteratorExpression Expresión FreeMarker utilizada para mostrar valores de una matriz anidada dentro de la variable especificada por la propiedad iteratorVariable.

Por ejemplo, si ha definido el valor de la propiedad iteratorVariable en "team" y esa variable tiene un elemento denominado members del que desea mostrar los valores, debe utilizar la expresión ${team.value.members}.

No
imageUrl URL de la imagen utilizada para un icono que identifica una acción. Puede utilizar esta propiedad para mostrar un icono para el botón de respuesta rápida de Facebook (que es una acción global). No
skipAutoNumbering Si se establece en true, esta propiedad excluye una acción de devolución individual de la aplicación de la numeración automática. Puede usar esta propiedad para una respuesta de texto o tarjeta. No
channelCustomProperties Lista de propiedades, algunas de las cuales disparan una funcionalidad específica del canal no controlada por las propiedades de acción estándar. Puede encontrar un ejemplo en el estado OrderPizza de CrcPizzaBot. No
name Nombre que identifica la acción en la plataforma de Digital Assistant. Este nombre se utiliza internamente y no se muestra en el mensaje. No
visible Determina cómo se muestran los anexos por entrada de usuario y canal. Consulte Propiedad visible. No
payload Objeto de carga útil para los elementos de respuesta call, url y postback. Consulte Propiedades de la carga útil. No

Propiedades de carga útil

Propiedad Descripción ¿Obligatoria?
action Transición action que se dispara cuando el usuario selecciona esta acción. No
variables Define los valores para variables cuando se define el tipo de acción en postback y se agregan propiedades de carga útil designadas para las variables. Cuando el usuario pulsa la acción, las variables se establecen en los valores especificados por esta propiedad. No
url URL del sitio web que se abre cuando los usuarios pulsan esta acción. Esta propiedad es necesaria para el tipo de acción url.
phoneNumber Número de teléfono al que se llama cuando un usuario pulsa esta acción. Esta propiedad es necesaria para el tipo de acción call.

¿Cómo se representan las acciones que no son de devolución en los canales de solo texto?

Algunos aspectos que se deben tener en cuenta para estas propiedades de metadatos de acción para los componentes de respuesta común.

  • Si el canal de solo texto admite hiperenlaces, puede utilizarlos en lugar de botones si el tipo de acción global es url o call.

  • Los tipos de acción share y location se ignorarán o no se representarán.

Consejo:

No es posible numerar las acciones que no son de devolución, como url y call, porque no se transfieren al motor de diálogo y, por lo tanto, no se pueden activar utilizando palabras clave. Por lo tanto, si combina los dos tipos de acciones, el mensaje del bot puede parecer inconsistente porque solo se numeran algunas opciones.
Imagen de tiempo de ejecución de numeración de acciones de devolución y que no son de devolución.
Con el SDK, puede crear una salida más consistente desactivando la numeración automática para la devolución. Por ejemplo:
{
  "type": "text",
  "text": "Please choose one of the following options",
  "actions": [
    {
      "type": "url",
      "label": "Check out our website",
      "url": "http://www.oracle.com"
    },
    {
      "type": "postback",
      "label": "<#if autoNumberPostbackActions.value>Enter 1 to Order pizza<#else>Order Pizza<#if>"
      "skipAutoNumber": true
      "keyword": "1"
      "postback": { ...}
    }
  ]
}

Elemento de respuesta de texto

Estas son las propiedades de los elementos de respuesta de texto en los componentes de respuesta común.

Propiedad Descripción ¿Obligatoria?
text Texto que se presenta al usuario.
iteratorExpression Expresión FreeMarker utilizada para mostrar valores de una matriz anidada dentro de la variable especificada por la propiedad iteratorVariable.

Por ejemplo, si ha definido el valor de la propiedad iteratorVariable en "team" y esa variable tiene un elemento denominado members del que desea mostrar los valores, debe utilizar la expresión ${team.value.members}.

 
iteratorVariable Agrega de manera dinámica varios elementos de texto, anexo o palabras clave a la respuesta mediante la iteración en los elementos de la variable. No
footerText Texto que se muestra en la parte inferior del mensaje (bajo las acciones de texto y botón, si las hay). Agregue un pie de página para mejorar la salida en los canales de solo texto. Como se describe en Pies de página, puede utilizar expresiones de FreeMarker para condicionar el texto del pie de página en los canales de solo texto. No
separateBubbles Puede definir esta propiedad si también define la propiedad iteratorVariable. Si define esta propiedad en true, cada elemento de texto se envía como un mensaje independiente, como Pizzas y Pastas en los estados ShowMenu y OrderPizza de CrcPizzaBot. Si la define en false, se envía un solo mensaje de texto, uno en el que cada elemento de texto comienza en una nueva línea. No
visible Determina cómo se muestran los mensajes de texto por canal y por entrada de usuario. Consulte Propiedad visible. No
actions Acción de devolución. En caso de compatibilidad solo con texto, puede definir palabras clave. No
Si desea ver un ejemplo de respuesta de texto con acciones, observe los metadatos del estado showMenu de CrcPizzaBot: Puesto que designa postback como una acción, permite a la aptitud gestionar un comportamiento de usuario inesperado, como la selección de un elemento de un mensaje más antiguo, en lugar de uno del mensaje más reciente.
metadata:
  responseItems:
    - type: "text"
      text: "Hello ${profile.firstName}, this is our menu today:"
      footerText: "${(textOnly.value=='true')?then('Enter number to make your choice','')}"
      name: "hello"
      separateBubbles: true
      actions:
        - label: "Pizzas"
          type: "postback"
          keyword: "${numberKeywords.value[0].keywords}"
          payload:
            action: "pizza"
          name: "Pizzas"
        - label: "Pastas"
          keyword: "${numberKeywords.value[1].keywords}"
          type: "postback"
          payload:
            action: "pasta"
          name: "Pastas"

Elemento de respuesta de tarjeta

Estas son las propiedades de los elementos de respuesta de tarjeta en los componentes de respuesta común.

Propiedad Descripción ¿Obligatoria?
cardLayout Diseño de tarjeta: horizontal (valor por defecto) y vertical.
headerText Texto de cabecera. Por ejemplo: headerText: "<#if cardsRangeStart?number == 0>Here are our pizzas you can order today:<#else>Some more pizzas for you:</#if>". No
title Título de la tarjeta
description Descripción de la tarjeta, que se muestra como un subtítulo. No
imageUrl URL de la imagen que se muestra bajo el subtítulo. No
cardUrl URL de un sitio web. Se muestra como un hiperenlace, que los usuarios tocan para abrir, en la tarjeta. No
iteratorExpression Expresión FreeMarker utilizada para mostrar valores de una matriz anidada dentro de la variable especificada por la propiedad iteratorVariable.

Por ejemplo, si ha definido el valor de la propiedad iteratorVariable en "team" y esa variable tiene un elemento denominado members del que desea mostrar los valores, debe utilizar la expresión ${team.value.members}.

 
iteratorVariable Agrega dinámicamente varias tarjetas a la respuesta iterando sobre los elementos almacenados en la variable especificada para esta propiedad. Aunque se defina la variable como una cadena, contiene una matriz de JSON cuando se utiliza como variable del iterador. Puede hacer referencia a las propiedades de un objeto de la matriz con una expresión como ${iteratorVarName.propertyName}. Por ejemplo, con una variable de iterador denominada pizzas, se puede hacer referencia a la propiedad de nombre de una pizza utilizando la expresión ${pizzas.name}. No
rangeStart Si ha especificado una propiedad iteratorVariable, puede eliminar un subconjunto de tarjetas especificando la propiedad rangeStart en combinación con la propiedad rangeSize. Puede introducir un valor codificado o utilizar una expresión FreeMarker que haga referencia a una variable que contenga el inicio del rango. Mediante una variable rangeStart, puede pasar al siguiente juego de datos definiendo la variable rangeStart en la carga útil de una opción de exploración. No
rangeSize Número de tarjetas mostradas como se especifica en las propiedades iteratorVariable y rangeStart. No
visible Determina cómo se representan las etiquetas de acción por canal y entrada de usuario. Consulte Propiedad visible. No

Puede asignar un juego de acciones que sean específicas de una tarjeta en particular o una lista de acciones conectadas al final de la lista de tarjetas.

El estado OrderPizza de CrcPizzaBot incluye una definición del elemento de respuesta de la tarjeta, como se muestra en el siguiente fragmento:
responseItems:
  - type: "cards"
    headerText: "<#if cardsRangeStart?number == 0>Here are our pizzas you can order today:<#else>Some more pizzas for you:</#if>"
    cardLayout: "vertical"
    name: "PizzaCards"
    actions:
      - label: "More Pizzas"
        keyword: "more"
        type: "postback"
        skipAutoNumber: true
        visible:
          expression: "<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>"
        payload:
          action: "more"
          variables:
            cardsRangeStart: "${cardsRangeStart?number+4}"
        name: "More"
    cards:
      - title: "${(textOnly=='true')?then((pizzas?index+1)+'. ','')}${pizzas.name}"
        description: "${pizzas.description}"
        imageUrl: "${pizzas.image}"
        name: "PizzaCard"
        iteratorVariable: "pizzas"
        rangeStart: "${cardsRangeStart}"
        rangeSize: "4"
        actions:
          - label: "Order Now"
            type: "postback"
            payload:
              action: "order"
              variables:
                orderedPizza: "${pizzas.name}"
                orderedPizzaImage: "${pizzas.image}"
            name: "Order"
            visible:
              expression: "${(textOnly=='true')?then('false','true')}"

¿Cómo se representan las tarjetas en canales de solo texto?

Los componentes de respuesta común representan las respuestas como tarjetas. Si la aptitud se ejecuta en un canal de solo texto, algunas de las propiedades del elemento de respuesta de la tarjeta se comportan de forma diferente. Estos son algunos aspectos que deben tenerse en cuenta:

  • No hay desplazamiento vertical ni horizontal (comportamientos definidos por la opción cardLayout). Todas las tarjetas se representan dentro de una sola burbuja de mensaje, que puede incluir una cabecera y un pie de página. Las propiedades title y description de la tarjeta se separan mediante un carácter de línea nueva. Puede numerar la propiedad title de la tarjeta.

  • Se admiten hiperenlaces en los canales de solo texto. La dirección configurada para la propiedad cardUrl se representa en la burbuja junto con las propiedades title y description, separadas por un carácter de línea nueva.

  • Se representan las imágenes especificadas por la propiedad imageURL.

  • Se muestra el texto de etiqueta de los botones de acción (aunque los botones no se representen). Los usuarios pueden introducir el texto o, si se ha activado la numeración automática, introducir en su lugar el número correspondiente, lo que resulte más cómodo.


Optimización de tarjetas en canales de solo texto con palabras clave

La mayoría de las tarjetas contienen una sola acción, como el botón "Order Now" de CRCPizzaBot, y una acción global, como "More", para cargar la siguiente tarjeta en el carrusel. Como se muestra en ¿Cómo se representan las tarjetas en canales de solo texto?, la etiqueta de cada acción se numera automáticamente cuando la aptitud se ejecuta en canales de solo texto/SMS. En estos canales, se representa un juego de tarjetas en una sola burbuja, que puede ser muy larga y, por lo tanto, difícil de leer. Para evitar esto, puede configurar acciones de devolución que no estén asociadas a las etiquetas de acción, sino que se ejecuten mediante palabras clave de usuario (1, 2, 3, cheese o more, por ejemplo).


A continuación, se incluye la Descripción de cards-text-only.png
Descripción de la ilustración cart-text-only.png

Puede ocultar las etiquetas de acción si la aptitud se ejecuta en canales de solo texto. Para ello, siga estas directrices generales.

En la propiedad metadata:
  • Defina la propiedad keywords. En el siguiente fragmento de CRCPizzaBot, la expresión ${pizza.name} definida para la propiedad keyword define una palabra clave para el nombre de cada pizza:
    
    metadata:
      keywords:
        - keyword: "${pizzas.name},<#if pizzas?index <numberKeywords.value?size>${numberKeywords.value[pizzas?index].keywords}</#if>,<#if pizzas?index==cardsRangeStart?number+[cardsRangeStart?number+3,pizzaCount.value?number-cardsRangeStart?number-1]?min>last</#if>"
          visible:
            expression: "${textOnly.value}"
    ...

    Estas palabras clave solo se agregan si textOnly se ha definido en true.

En los metadatos card:
  • Defina la propiedad title. En el siguiente fragmento, una expresión utiliza la variable index de FreeMarker para prefijar un número al título (devuelto por ${pizzas.name} cuando el valor de la variable textOnly es true). Esto significa que, cuando un cliente introduce more, la aptitud carga otra burbuja de mensaje que contiene el siguiente juego de pizzas, a partir del número 5 (rangeSize: "4").
    cards:
            - title: "${(textOnly=='true')?then((pizzas?index+1)+'. ','')}${pizzas.name}"
              description: "${pizzas.description}"
              imageUrl: "${pizzas.image}"
              name: "PizzaCard"
              iteratorVariable: "pizzas"
              rangeStart: "${cardsRangeStart}"
              rangeSize: "4"
  • En el siguiente fragmento, las acciones de tarjeta ("Order" y "More Pizzas") solo se muestran cuando el valor de la variable textOnly es false:
            - label: "More Pizzas"
              keyword: "more"
              type: "postback"
              skipAutoNumber: true
              visible:
                expression: "<#if cardsRangeStart?number+4 < pizzas.value?size && textOnly=='false'>true<#else>false</#if>"
  • Agregue un pie de página que se muestre solo cuando el valor de la variable textOnly sea true.
    footerText: "<#if textOnly=='true'>Enter a pizza number to make your choice<#if cardsRangeStart?number+4 < pizzas.value?size>, or type 'more' to see more pizzas</#if></#if>"

Elemento de respuesta del anexo

El elemento de respuesta attachment incluye las siguientes propiedades.

Propiedad Descripción ¿Obligatoria?
attachmentType Tipo de anexo: image, audio, video y file.
attachmentURL URL u origen de descarga del anexo.
El estado Confirmation de CrcPizzaBot utiliza un elemento de respuesta de anexo para mostrar la imagen del pedido, que es diferente del elemento mostrado en el menú.
metadata:
  responseItems:
  - text: "Thank you for your order, your ${pizzaSize} ${orderedPizza} pizza\
      \ will be delivered in 30 minutes at GPS position ${location.value.latitude},${location.value.longitude}!"
    type: "text"
    name: "conf"
    separateBubbles: true
  - type: "attachment"
    attachmentType: "image"
    name: "image"
    attachmentUrl: "${orderedPizzaImage}"

Acción

Una acción representa algo que el usuario puede seleccionar.
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de acción Cadena
label Texto de etiqueta descriptivo de la acción. Cadena Se debe incluir al menos uno de estos elementos: label o imageUrl.
imageUrl Imagen para la acción Cadena Se debe incluir al menos una sola propiedad label o imageUrl.
style El estilo de representación del botón "primary", "danger", "default" No
displayType Representación del tipo de elemento de acción (botón, enlace o icono) "button", "link", "icon" No
channelExtensions Propiedades de extensión específicas del canal asociadas a la acción JSONObject No

Campo

Un elemento Field contiene las siguientes propiedades:
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo String No
label La etiqueta de campo String
channelExtensions Conjunto de propiedades de extensión específicas del canal. Map<ChannelType, JSONObject> No
marginTop Cantidad de espacio vertical entre este campo y el campo anterior en la misma columna. Los valores permitidos son none, medium (valor por defecto) y large. String No
labelFontSize Tamaño de fuente utilizado para la etiqueta de campo. Los valores permitidos son small, medium (valor por defecto) y large. String No
labelFontWeight El grosor de fuente utilizado para la etiqueta de campo. Los valores permitidos son light, medium (valor por defecto) y negrita. String No
displayInTable Expresión booleana FreeMarker que permite incluir condicionalmente un campo en el diseño de tabla en un elemento de respuesta dataSet. String No (el valor por defecto es true)
displayInForm Expresión booleana FreeMarker que permite incluir condicionalmente un campo en un el elemento de respuesta editForm o en el diseño de formulario en un elemento de respuesta dataSet String No (el valor por defecto es true)

Campo ReadOnly

Representa un campo de solo lectura. Todos los campos de solo lectura heredan las propiedades Field y tienen las siguientes propiedades adicionales:
Nombre Descripción Tipo ¿Obligatoria?
value El valor del campo Cadena
width Porcentaje sugerido del ancho total disponible que debe ocupar el campo en un diseño de tabla. número No
alignment La alineación del valor dentro de una columna de tabla. La alineación por defecto es right. "left", "center" y "right" No
Nota

En la versión 23.06 de Oracle Digital Assistant, los campos de solo lectura no se presentan en los formularios de entrada, incluso si se reciben en la carga útil del mensaje.
TextField
El elemento TextField hereda todas las propiedades del campo ReadOnly. El displayType para este elemento es "text". Tiene las siguientes propiedades adicionales:
Nombre Descripción Tipo ¿Obligatoria?
truncateAt Posición en la que se trunca el texto largo y se agregan puntos suspensivos para indicar que el valor se ha truncado. Valor entero No
fontSize Tamaño de fuente utilizado para el valor field. Los valores permitidos son small, medium (valor por defecto) y large. Cadena No
fontWeight El grosor de fuente utilizado para el valor field. Los valores permitidos son ligero, medio (valor por defecto) y negrita. Cadena No
LinkField
El elemento LinkField hereda todas las propiedades del campo ReadOnly. Tiene las siguientes propiedades adicionales:
Nombre Descripción Tipo ¿Obligatoria?
linkLabel Etiqueta utilizada para el hiperenlace Cadena No
imageUrl URL de la imagen que abre un enlace al hacer clic. Cadena No
MediaField
El elemento MediaField hereda todas las propiedades del campo ReadOnly. Tiene las siguientes propiedades adicionales:
Nombre Descripción Tipo ¿Obligatoria?
mediaType Tipo de medio de campo ("video", "audio", "image") String
ActionField
El elemento ActionField hereda todas las propiedades del campo ReadOnly. Tiene las siguientes propiedades adicionales:
Nombre Descripción Tipo ¿Obligatoria?
action Acción que se debe realizar cuando el usuario hace clic en el botón de acción. Acción

Formulario

Representa una matriz de campos junto con un título.
Nombre Descripción Tipo ¿Obligatoria?
title El título que se muestra encima del diseño del formulario Cadena No
fields Lista de campos de solo lectura del formulario Lista<ReadOnlyField>
formRows Lista de filas mostradas en el formulario. Mostrar<FormRow>  
actions Una lista de acciones Mostrar<Acción> No
selectAction Acción que se ejecuta cuando se selecciona el formulario. Cuando los usuarios pasan el mouse sobre el formulario, la etiqueta de la acción se muestra como una sugerencia de herramienta (cuando está soportada por el canal). Acción No
channelExtensions Las propiedades de extensión específicas del canal asociadas al mensaje JSONObject No

FormRow

Nombre Descripción Tipo ¿Obligatoria?
columns Lista de columnas mostradas en la fila del formulario. Mostrar <columna>
selectAction Acciones que se ejecutan cuando se selecciona el formulario. Cuando los usuarios pasan el cursor sobre el formulario, la etiqueta de la acción, se muestra como una pista (cuando está soportada por el canal). Acción No
separator Si se define esta propiedad en true, se inserta una línea de separador sobre el contenido de la fila del formulario. Boolean No
channelExtensions Las propiedades de extensión específicas del canal asociadas al mensaje JSONObject No

Columna

Nombre Descripción Tipo ¿Obligatoria?
fields Lista de campos que se muestran verticalmente en la columna. Estos campos deben ser instancias ReadOnlyField cuando la columna se utiliza en FormRow dentro de Form. Los campos pueden ser campos de solo lectura y editables cuando se utiliza FormRow en EditFormMessagePayload. Mostrar<Campo>
verticalAlignment La alineación vertical de la columna con respecto a las otras columnas de la misma fila de formulario. Cadena No
width Determina el ancho de la columna dentro de la fila del formulario. Los valores permitidos son auto (valor por defecto) y stretch. Cuando se define en stretch, la columna toma todo el ancho restante después de presentar cualquier columna de ancho automático. Si hay varias columnas definidas en stretch, dividen de forma uniforme el ancho restante. Cadena No
channelExtensions Las propiedades de extensión específicas del canal asociadas al mensaje JSONObject No

Elemento de respuesta editForm

Este elemento de respuesta forma la EditFormMessagePayload que se transmite a través de un canal al cliente.
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de elemento de respuesta. editform
title El título del formulario Cadena No
items Lista de campos, tanto de solo lectura como editables. Enumerar<field>
formColumns Número de columnas utilizadas para el diseño del formulario. El valor predeterminado es una columna. Entero No
actions Lista de acciones relacionadas con tarjetas. Enumerar<Action> No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo textInput

Un campo para introducir texto libre. Puede definir los caracteres mínimo y máximo para este campo y aplicar formato mediante expresiones regulares.

Este fragmento ilustra la recopilación de entradas de usuario haciendo referencia a la variable submittedFields generada (una asignación).
      - displayType: textInput
        multiLine: true
        defaultValue: "${(submittedFields.value.Description)!''}"
        minLength: 10
        name: Description
        label: Description
        placeholder: What is the expense justification?
        clientErrorMessage: "Description must be 10 characters minimum, 50 characters maximum."
        maxLength: 50
        required: true
      - displayType: textInput
        multiLine: true
        defaultValue: "${(submittedFields.value.Notes)!''}"
        minLength: 10
        name: Notes
        inputStyle: email
        label: Notes
        placeholder: Expense notes (optional)
        maxLength: 50
        required: false
Este fragmento ilustra la recopilación de la entrada del usuario haciendo referencia a una variable de bolsa compuesta.
Nota

El artículo de bolsa compuesta al que se hace referencia puede ser un elemento STRING.
      - displayType: textInput
        serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Tip'])!''}"
        defaultValue: "${(expense.value.Tip.originalString)!''}"
        displayInForm: "${(((expense.value.TipIncluded.yesno)!'') == 'NO')?then(true, false)}"
        name: Tip
        label: Tip
        placeholder: Enter the tip
        clientErrorMessage: Tip is required
        required: true
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo. textInput (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label La etiqueta de campo Cadena No
defaultValue El valor inicial. Según la expresión FreeMarker de la plantilla, el valor es una cadena cuando el elemento de bolsa al que se hace referencia (representado por myText) no tiene ningún valor ("${(submittedFields.value.myText)!''}"). Cadena No
validationRegularExpression Expresión regular que especifica el formato de la entrada de texto. Cadena No
multiline La definición de esta propiedad en true permite a los usuarios introducir varias líneas de texto. Boolean No
minlength Número mínimo de caracteres necesarios para validar el campo. Los usuarios reciben un mensaje de error si introducen muy pocos caracteres. Entero No
maxLength Número o límite máximo de caracteres. Entero No
inputStyle El formato que se aplica en el cliente. Los formatos son:
  • text
  • email
  • url
  • tel
  • password
El formato por defecto es el texto cuando esta propiedad no se ha definido.
Cadena No
placeholder Indicación que describe cómo utilizar este campo. Este texto se muestra cuando los usuarios aún no han introducido ninguna entrada. Por ejemplo:
What is the expense justification? Enter between 10 and 50 characters.
Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo boolean No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo datePicker

Campo con un calendario desplegable que permite a los usuarios seleccionar un día, un mes y un año. Las propiedades maxDate y minDate del componente validan la entrada del usuario.
Nota

El canal de Slack no soporta esta validación de valor mínimo y máximo.
Este fragmento de código ilustra cómo capturar la entrada del usuario mediante la variable submittedFields generada (una asignación).
 - displayType: datePicker
        defaultValue: "${(submittedFields.value.Date)!''}"
        name: Date
        maxDate: "${.now?iso_utc[0..9]}"
        label: Expense Date
        placeholder: Pick a date in the past
        clientErrorMessage: Expense date is required and must be in the past.
        required: true
Este fragmento ilustra cómo capturar la entrada del usuario haciendo referencia a una variable de bolsa compuesta.
     - displayType: datePicker
        serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Date'])!''}"
        defaultValue: "${(expense.value.Date.date?number_to_date?iso_utc)!''}"
        name: Date
        maxDate: "${.now?iso_utc[0..9]}"
        label: Expense Date
        placeholder: Pick a date in the past
        clientErrorMessage: Expense date is required and must be in the past.
        required: true
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo datePicker (una cadena)
id Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Etiqueta descriptiva. Cadena No
defaultValue El valor predeterminado del campo, con el formato AAAA-MM-DD. La plantilla define esta cadena como una expresión FreeMarker de Apache que devuelve una cadena vacía cuando el elemento de bolsa compuesta al que se hace referencia (representado por myDate) tiene un valor nulo.
"${(submittedFields1.value.myDate)!''}"
Cadena No
minDate Primera fecha en el rango de días permitidos. El canal de Slack no admite esta validación del lado del cliente. Cadena No
maxDate Última fecha en el rango de días permitidos. La plantilla define esta cadena como el día actual ("${.now?iso_utc[0..9]}"). El canal de Slack no admite esta validación del lado del cliente. Cadena No
placeholder Descripción de la entrada esperada que se muestra cuando el usuario aún no ha seleccionado una fecha. Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo booleano No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo timePicker

Permite al usuario escribir un valor de hora dentro de un intervalo especificado. Las propiedades maxTime y minTime del componente validan la entrada del usuario.
Nota

El canal de Slack no soporta la validación de valor mínimo y máximo.
El campo de selector de hora lee y escribe el valor en formato de 24 horas. El formato de visualización en el canal cliente puede utilizar el formato de 12 horas con una indicación AM/PM, pero siempre debe escribir una hora con formato de 24 horas.
El siguiente fragmento ilustra cómo capturar la entrada del usuario mediante la variable submittedFields generada (una asignación).
      - displayType: timePicker
        defaultValue: "${(submittedFields.value.Time.value?time.xs?string['hh:mm a'])!''}"
        maxTime: "23:00"
        minTime: "13:00"
        name: Time
        label: Expense Time
        placeholder: What time was the expense?
        clientErrorMessage: This time is outside the limits.
        required: true
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo timePicker (una cadena)
id Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Etiqueta que describe los parámetros de selección de tiempo. Cadena
defaultValue El valor inicial de este campo, en formato de 24 horas. La plantilla define esta cadena como una expresión FreeMarker de Apache que devuelve una cadena vacía cuando el elemento de bolsa compuesta al que se hace referencia (representado por myTime) tiene un valor nulo.
"${(submittedFields.value.myTime)!''}"
Cadena No
minTime Define la hora más temprana permitida, escrita como HH:MM en formato de 24 horas. Por ejemplo, 00:00. Cadena No
maxTime Define la última hora permitida, escrita como HH:MM, en formato de 24 horas. Por ejemplo, 13:00. Cadena No
placeholder Indicación para la entrada. Según la plantilla, el ejemplo placeholder es Pick a time in the morning, que refleja los valores minTime y maxTime de ejemplo de la plantilla de 00:00 y 12:00. Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo boolean No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. Por ejemplo, Time must be in the morning. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo numberInput

Recopila la entrada de número dentro de un rango especificado.
      - displayType: numberInput
        minValue: 5
        serverErrorMessage: "${(amountError.value)!''}"
        maxValue: 500
        defaultValue: "${(submittedFields.value.Amount)!''}"
        name: Amount
        label: Amount
        placeholder: Enter the expense amount (do not include currency symbol)
        clientErrorMessage: Amount is required and must be between 5 and 500 characters
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo numberInput (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Etiqueta descriptiva para el valor de fecha requerido por el usuario. Cadena No
defaultValue El valor inicial. La plantilla define esta cadena como una expresión FreeMarker de Apache que devuelve una cadena vacía cuando el elemento de bolsa compuesta al que se hace referencia (representado por myNumber) tiene un valor nulo. "${(submittedFields.value.myNumber)!''}" Cadena No
maxvalue El mayor número permitido. El canal de Slack no soporta la validación de valor mínimo o máximo. Entero No
minvalue Un número mínimo permitido Entero No
placeholder Indicación que describe cómo utilizar el campo. Este texto se muestra cuando el usuario aún no ha escrito un número. Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo boolean No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo singleSelect

Permite a los usuarios seleccionar un único valor de una lista predefinida. Puede aplicar un estilo a este control como una lista que los usuarios pueden consultar y seleccionar, o como un juego de botones de radio. Este elemento tiene una representación específica del canal:
  • En el canal de Microsoft Teams, este elemento siempre se presenta como una lista (incluso cuando layoutStyle está definido en radioGroup) porque las tarjetas adaptables no admiten botones de radio.
  • En el canal de Slack, este elemento se presenta como una lista en lugar de un grupo de radio cuando hay más de diez opciones.
El siguiente fragmento ilustra el relleno de la lista mediante la variable submittedFields generada (una variable de asignación)
 - displayType: singleSelect
        defaultValue: "${(submittedFields.value.Type)!''}"
        name: Type
        options:
          - iteratorVariable: option
            iteratorExpression: "${expenseType.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
        layoutStyle: list
        label: Expense Type
        placeholder: Select expense type
        clientErrorMessage: Expense type is required
        required: true

Consejo:

Aunque clientErrorMessage es un atributo opcional, le recomendamos que lo defina para las aptitudes que se ejecutan en el canal de Microsoft Teams porque las tarjetas adaptables no generan un mensaje cuando falla la validación del cliente.
Este fragmento ilustra cómo rellenar la lista haciendo referencia a una entidad de bolsa compuesta:
     - autoSubmit: true
        displayType: singleSelect
        serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Type'])!''}"
        defaultValue: "${(expense.value.Type.value)!''}"
        name: Type
        options:
          - iteratorVariable: option
            iteratorExpression: "${expenseType.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
        layoutStyle: list
        label: Expense Type
        placeholder: Select expense type
        clientErrorMessage: Expense type is required
        required: true
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo singleSelect (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Texto de etiqueta de campo que describe el contenido de la lista de selección única. Cadena
defaultValue Selección por defecto. La plantilla define este valor de cadena como una expresión FreeMarker de Apache que devuelve una cadena vacía cuando el elemento de bolsa compuesta al que se hace referencia (representado por mySingleSelect) tiene un valor nulo. "${(submittedFields.value.mySingleSelect)!''}" Cadena No
options Matriz de las opciones disponibles. La plantilla define estas opciones de forma estática con pares individuales label y value con valores de cadena, pero puede rellenar las opciones de selección de forma dinámica mediante las propiedades iteratorVariable y iteratorExpression:
        defaultValue: "${(submittedFields.value.Type)!''}"
        name: Type
        options:
          - iteratorVariable: option
            iteratorExpression: "${expenseType.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
En este fragmento, los valores de tipo de gasto devueltos por las propiedades type y enum se secuencian en la lista mediante el uso de split incorporado.
Lista<opción>
layoutStyle Cómo se presentan las opciones de selección única en el formulario. Se pueden agrupar como una lista (layoutStyle: list) o como botones de radio (layoutStyle: radioGroup). Cadena  
placeholder Indicación que describe cómo utilizar el campo. Se muestra cuando el usuario aún no ha realizado la selección. Por ejemplo:
label: 
        placeholder: Select an expense type. You can pick only one.
Este marcador de posición se muestra solo para la representación de diseño de lista.
Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo boolean No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo multiSelect

Permite a los usuarios seleccionar uno o más valores de una lista predefinida. Puede aplicar estilo a una lista de selección que los usuarios puedan consultar o a un juego de casillas de control. Este elemento tiene una representación específica del canal:
  • En el canal de Microsoft Teams, este elemento siempre se presenta como una lista (incluso cuando layoutStyle está definido en checkboxes) porque las tarjetas adaptables no soportan casillas de control de selección múltiple.
  • En el canal de Slack, este elemento se presenta como una lista en lugar de un juego de casillas de control de selección múltiple cuando hay más de diez opciones.
Este fragmento ilustra cómo rellenar la lista haciendo referencia a la variable submittedFields generada (una asignación).
 - displayType: multiSelect
        defaultValue: "${(submittedFields.value.Attendees?join(','))!''}"
        name: Attendees
        options:
          - iteratorVariable: option
            iteratorExpression: "${attendee.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
        layoutStyle: list
        label: Attendees
        placeholder: Select one or more attendees

Este fragmento ilustra la referencia a una entidad de bolsa compuesta para rellenar la lista.
     - displayType: multiSelect
        serverErrorMessage: "${(system.entityToResolve.value.validationErrors['Attendees'])!''}"
        displayInForm: "${(((expense.value.Type.value)!'') == 'Meal')?then(true, false)}"
        defaultValue: "${(expense.value.Attendees?map(a -> a.value)?join(','))!''}"
        name: Attendees
        options:
          - iteratorVariable: option
            iteratorExpression: "${attendee.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
        layoutStyle: list
        label: Attendees
        placeholder: Select attendees
        clientErrorMessage: Attendees are required when expense type is a Meal
        required: true
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo multiselect (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Etiqueta de campo que describe el contenido de la lista multiSelect. Cadena
defaultValue Selección por defecto. La plantilla define esta cadena como una expresión FreeMarker de Apache que devuelve una cadena vacía cuando el elemento de bolsa compuesta al que se hace referencia (representado por myMultiSelect) tiene un valor nulo.
"${(submittedFields.value.myMultiSelect?join(','))!''}"
List<String> No
options Matriz de las opciones disponibles. La plantilla define estas opciones de forma estática con pares individuales label y value con valores de cadena, pero puede rellenar las opciones de selección de forma dinámica mediante las propiedades iteratorVariable y iteratorExpression:
        defaultValue: "${(submittedFields.value.Attendees?join(','))!''}"
        name: Attendees
        options:
          - iteratorVariable: option
            iteratorExpression: "${attendee.type.enumValues?split(',')}"
            label: "${option}"
            value: "${option}"
List<option>
placeholder Indicación que describe cómo utilizar el campo. Se muestra cuando el usuario no ha realizado ninguna selección.
label: Attendees
        placeholder: Select one or more attendees
Este marcador de posición se muestra solo para el diseño de lista. No está disponible para los diseños de casilla de control.
Cadena No
layoutStyle Diseño de las opciones multiSelect. Las opciones son list y checkboxes. Cadena No
autoSubmit Si se define en true, el formulario se envía parcialmente cuando el usuario ha introducido un valor para el campo. En FormSubmissionMessagePayload, partialSubmitField se define en el nombre del campo donde autoSubmit se define en true. Le recomendamos que configure el envío automático para campos condicionalmente dependientes. Por ejemplo, establezca esta propiedad cuando se muestre u oculte un campo en función del valor de otro campo o cuando los valores permitidos de un campo dependan del valor definido en otro campo. Al enviar automáticamente un campo del que dependen otros campos, el formulario se puede actualizar inmediatamente con los cambios relevantes en los campos dependientes. Cadena No
required Si el envío del formulario requiere la entrada del usuario en este campo booleano No
clientErrorMessage Mensaje utilizado por algunos clientes (MS Teams, Apple Business Messaging) cuando falla la validación del lado del cliente. En Slack, esta propiedad solo se utiliza cuando el formulario editable se muestra en la página de conversación. No se muestra en un cuadro de diálogo modal. Cadena No
serverErrorMessage Mensaje de error que se envía al cliente cuando falla la validación del lado del servidor de un valor de campo de formulario. Cuando se producen errores de este tipo en el servidor, se recomienda sustituir el mensaje de formulario actual, en lugar de un nuevo mensaje agregado a la conversación mediante la configuración de la propiedad channelExtensions para indicar que se debe sustituir el último mensaje de formulario. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

El campo de alternancia

Presenta un conmutador para dos opciones. En el canal de Slack, este control se presenta como casillas de control.
Nota

En el canal de Slack, este elemento se representa como un par de botones de radio.
Este fragmento ilustra la captura de la entrada del usuario haciendo referencia a la variable submittedForms generada (una asignación).
      - displayType: toggle
        defaultValue: "false"
        name: TipIncluded
        labelOn: Tip
        label: Tip Included?
        valueOff: "false"
        labelOff: No Tip
        valueOn: "true"
Este fragmento ilustra la captura de la entrada del usuario haciendo referencia a una variable de bolsa compuesta.
      - autoSubmit: true
        displayType: toggle
        defaultValue: "${(expense.value.TipIncluded.yesno)!'YES'}"
        name: TipIncluded
        labelOn: "Yes"
        label: Tip Included?
        valueOff: "NO"
        labelOff: "No"
        required: false
        valueOn: "YES"
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo toggle (una cadena)
id Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
label Etiqueta que describe lo que sucede cuando se activa el conmutador. Cadena
defaultValue El valor inicial. Si desea que el conmutador esté activado inicialmente, defínalo con el valor valueOn. La plantilla define esta cadena como una expresión FreeMarker de Apache que activa el conmutador cuando el elemento de bolsa compuesta al que se hace referencia (representado por myToggle) tiene un valor nulo.
"${(submittedFields.value.myToggle)!'true'}"
Cadena
valueOff El valor cuando el conmutador está desactivado. El valor por defecto, según la plantilla, es false (valueOff: "false" ). Cadena
valueOn El valor cuando se activa el conmutador. El valor por defecto de la plantilla es true (value On: "true" ) Cadena
labelOn Una etiqueta para la posición de activación del conmutador Cadena No
labelOff Etiqueta para la posición de desactivación del conmutador. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

Campo de texto

Un elemento de campo contiene las siguientes propiedades:
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de elemento. text (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
value Valor sin procesar para el campo Cadena
width Porcentaje del ancho total disponible que debe ocupar el elemento en un diseño de tabla. El ancho restante, a partir de 100 menos los elementos con un ancho especificado, se divide por igual sobre los elementos sin un ancho especificado. Entero No
alignment La alineación del valor con una columna de tabla. left, center y right. El valor por defecto es right. No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

Campo de enlace

Un elemento de campo contiene las siguientes propiedades:
Nombre Descripción Tipo ¿Obligatoria?
displayType Tipo de campo link (una cadena)
name Nombre único del campo dentro del formulario de entrada. Este nombre se utiliza como identificador en tiempo de ejecución. Cadena
value Dirección URL. Por ejemplo: http:www.oracle.com Cadena
width Porcentaje del ancho total disponible que debe ocupar el elemento en un diseño de tabla. El ancho restante, a partir de 100 menos los elementos con un ancho especificado, se divide por igual sobre los elementos sin un ancho especificado. Entero No
alignment La alineación del valor con una columna de tabla. Los valores permitidos son left, center y right. El valor por defecto es right. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No

EditFormMessagePayload

Esta carga útil define el formulario editable que se envía a los canales.
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de carga útil del mensaje. editForm (una cadena)
headerText Texto del encabezado que se muestra sobre el formulario. Cadena No
footerText Texto que se muestra debajo del formulario y las acciones, pero encima de las acciones globales. Cadena No
title El título del formulario Cadena No
formRows Lista de filas mostradas en el formulario. Lista <FormRow> No
fields Lista de campos, tanto de solo lectura como editables. Enumerar<field>
formColumns Número de columnas utilizadas para el diseño del formulario. El valor predeterminado es una columna. Entero No
actions Una lista de acciones. Enumerar<Action> No
globalActions Lista de acciones globales. La representación de estas acciones es específica del canal. Por ejemplo, las acciones de Facebook las presenta reply_actions. Enumerar<Action> No
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No
Envío automático de un campo
Cuando un campo tiene la propiedad autoSubmit definida en true, el cliente envía un valor FormSubmissionMessagePayload con la asignación submittedField que contiene los valores de campo válidos que se han introducido hasta ahora o solo el valor del campo enviado automáticamente (la implantación es específica del canal). Los campos que aún no se hayan definido (independientemente de si son obligatorios) o los campos que violan una validación del lado del cliente no se incluyen en la asignación submittedField. Si el campo de envío automático en sí contiene un valor que no es válido, FormSubmissionMessagePayload no se envía y, en su lugar, se muestra el mensaje de error del cliente.
Nota

Microsoft Teams no soporta el envío automático.

SubmitFormAction

Nombre Descripción Tipo ¿Obligatoria?
type Tipo de acción submitForm (una cadena)
postback La carga útil de devolución, que puede incluir una propiedad de acción para disparar la navegación. Recomendamos que el valor de esta propiedad se tome del objeto de devolución FormSubmissionMessagePayload. JSONObject No
variable Nombre de la variable que almacena los valores enviados. Estos valores están en FormSubmissionMessagePayload. Cadena No
processingMethod Instrucciones de proceso utilizadas por el componente Resolución Entidades para los valores de campo enviados. Puede definirlo en FormSubmissionMessagePayload, pero también puede definir:
  • mapVariable
  • separateVariables
  • compositeBag
.
Cadena
label Etiqueta para la acción de visualización. Cadena Sí: debe especificar al menos un valor label o imageUrl.
imageUrl Imagen para la acción de visualización. Cadena Debe especificar al menos un valor label o imageUrl.
channelExtensions Conjunto de propiedades de extensión específicas del canal. Por ejemplo, puede que desee establecer la altura máxima para Facebook Messenger. Mapa<ChannelType, JSONObject> No
FormSubmissionMessagePayload
Esta carga útil la devuelven los canales al pipeline de ODA cuando el usuario ha enviado un formulario haciendo clic en el botón SubmitFormAction. Tiene las siguientes propiedades:
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de la carga útil. "formSubmission" (un valor de cadena)
submittedFields Pares clave-valor de los valores de campo enviados. La clave es el nombre (ID) del campo. Asignar<Cadena, Objeto>
postback La carga útil de devolución, que puede incluir una propiedad de acción para disparar la navegación. Recomendamos que el valor se tome de SubmitFormAction JSONObject No
partialSubmitField Nombre del campo que dispara un envío parcial del formulario. Los campos con el envío automático activado (autoSubmit: true) pueden disparar un envío de formulario parcial. Cadena No

Actualización del formulario de entrada

Cuando el usuario final envía el formulario, ya sea porque un campo tiene autosubmit definido en true o porque el usuario ha pulsado el botón de acción submitForm, puede haber situaciones en las que el usuario no haya proporcionado toda la información necesaria o que algunos valores de campo contengan un valor no válido. En tal caso, el motor de diálogo enviará un nuevo EditFormMessagePayload, pero ese mensaje debe sustituir al mensaje de formulario anterior. Para indicar al canal de cliente que sustituya el mensaje de formulario anterior, en lugar de agregar un nuevo mensaje de formulario a la conversación, configure la propiedad de extensión de canal replaceMessage de la siguiente manera:
- channel: ${system.channelType}
  properties:
    replaceMessage: "${system.message.messagePayload.type == 'formSubmission'}"
En tiempo de ejecución, esta propiedad se agrega al elemento channelExtensions de nivel raíz de la carga útil del componente de respuesta común:
...,
"channelExtensions": { "replaceMessage": "true"}

TableMessagePayload

Presenta los datos en formato tabular y de formulario.
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de carga útil del mensaje "table"
headings Lista de cabeceras de columna de tabla Mostrar<TableHeading>
rows Lista de filas de tabla Mostrar<Fila>
forms Lista de formularios Lista
formColumns Número de columnas utilizadas en el diseño de formulario. El valor por defecto es 1. Entero
paginationInfo Información de paginación que se puede utilizar para representar los botones de juego anterior o siguiente PaginationInfo

Fila

Nombre Descripción Tipo ¿Obligatoria?
fields Una lista de campos de solo lectura Mostrar <ReadOnly Field>
selectAction Acciones que se ejecutan cuando se selecciona el formulario. Cuando los usuarios pasan el cursor sobre el formulario, la etiqueta de la acción, se muestra como una pista (cuando está soportada por el canal). Acción No
channelExtensions Las propiedades de extensión específicas del canal asociadas al mensaje Asignación<ChannelType>,JSONObject No

TableHeading

Una cabecera de tabla contiene las siguientes propiedades:
Nombre Descripción Tipo ¿Obligatoria?
label La etiqueta de cabecera Cadena
width Ancho de la cabecera lable Cadena No
alignment La alineación del valor de columna (left, right o center). El valor por defecto es right. Cadena No
channelExtensions Conjunto de propiedades de extensión específicas del canal.
Map<ChannelType>, JSONObject>
No

PaginationInfo

Representa la información de paginación de los resultados en los objetos Table, Form y Table-Form.

Nombre Descripción Tipo ¿Obligatoria?
totalCount Recuento total de resultados número
rangeSize El tamaño de rango de los resultados por página número
status El mensaje de estado de paginación Cadena
currentRangeSize El tamaño del rango de resultados actual número
rangeStart Desplazamiento inicial del intervalo de resultados actual número
nextRangeSize El tamaño del siguiente rango de resultados número
hasPrevious Indica si hay un juego de resultados anterior booleano
hasNext Indica si hay un siguiente juego de resultados booleano

tableFormMessageLayout

Presenta los datos en formato tabular y de formulario.
Nombre Descripción Tipo ¿Obligatoria?
type Tipo de carga útil del mensaje "tableForm"
headings Lista de cabeceras de columna de tabla Mostrar<TableHeading>
rows Lista de filas de tabla Mostrar<Fila>
forms Lista de formularios Lista
formColumns Número de columnas utilizadas en el diseño de formulario. El valor por defecto es 1. Entero
showFormButtonLabel Etiqueta del botón que se utiliza para mostrar el diseño del formulario para una fila específica. Cadena
paginationInfo Información de paginación que se puede utilizar para representar los botones de juego anterior o siguiente PaginationInfo

Elemento de respuesta dataSet

El elemento de respuesta dataSet permite crear tablas y formularios. Incluye las siguientes propiedades.

Propiedad Descripción ¿Obligatoria?
layout Estilo de diseño utilizado para representar dataSet. Los valores permitidos son table, form y tableForm.
formColumns Número de columnas utilizadas para representar elementos en un diseño de formulario. Solo se aplica cuando el diseño es form o tableForm. El valor por defecto es 1. No
showFormButtonLabel Etiqueta utilizada para abrir el cuadro de diálogo de formulario con un estilo de diseño tableForm. Actualmente solo se utiliza en canales de Slack. Los otros canales soportan la ampliación de la fila de tabla para mostrar los elementos adicionales en un diseño de formulario No
data Se utiliza para definir una entrada de datos en dataSet. Consulte DataSet data Properties.

Propiedades de datos de DataSet

La propiedad data del elemento de respuesta dataSet incluye las siguientes subpropiedades.

Propiedad Descripción ¿Obligatoria?
iteratorExpression Define una expresión de Freemarker que devuelve una lista de entradas para iterar, lo que permite agregar dinámicamente varias entradas de datos a dataSet. No
iteratorVariable Especifica el nombre de la variable de iterador que puede utilizar para hacer referencia a la entrada de datos actual dentro de la lista de entradas de datos que se repiten. No
rangeSize Número de entradas de datos que se mostrarán a la vez cuando haya especificado las propiedades iteratorExpression y iteratorVariable. No
visible Determina cómo se muestran los mensajes por canal y entrada de usuario. Consulte Propiedad visible. No
formTitle Título utilizado para el cuadro de diálogo de formulario en el diseño tableForm del canal de Slack. El valor por defecto es View details. No
items Elementos de datos que se deben mostrar para cada entrada de datos. Consulte DataSet Data Item Properties.

DataSet Propiedades del elemento de datos

Propiedad Descripción ¿Obligatoria?
width Porcentaje (expresado como un entero) del ancho total disponible que el elemento debe utilizar en un diseño de tabla. El ancho restante, a partir de 100 menos los elementos con un ancho especificado, se divide por igual sobre los elementos sin un ancho especificado. No
alignment La alineación del valor con una columna de tabla. Los valores permitidos son left, center y right. El valor por defecto es left. No
displayType Tipo de visualización del elemento. Los valores permitidos son text y link. El valor por defecto es text. No
linkLabel Etiqueta utilizada para el hiperenlace cuando el tipo de visualización se define en link. El valor por defecto es el valor de la propiedad value del elemento. No
displayInTable Define si el elemento se debe mostrar como una columna en la tabla. Esta propiedad solo se aplica en el diseño tableForm. Toma false como valor por defecto. No
displayInForm Define si el elemento se debe mostrar como un campo en el formulario. Esta propiedad solo se aplica en el diseño tableForm. Toma false como valor por defecto. No
label Etiqueta del elemento de datos.
value Valor del elemento de datos.

Variable system.entityToResolve

La variable system.entityToResolve proporciona información sobre el estado actual del proceso de resolución de entidades, tal y como lo realizan los componentes Resolver entidades y Respuesta común. Normalmente, hará referencia a las propiedades de este valor de variable en los metadatos del componente de respuesta común cuando desee personalizar los mensajes. Puede utilizarla para definir la lógica del mensaje de error de una entidad, o para varias propiedades que pertenecen a los componentes Resolver entidades y Respuesta común. Agregue las siguientes propiedades para devolver el valor de la entidad actual:
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
También puede hacer referencia a las propiedades de las expresiones FreeMarker que han utilizado propiedades de elementos de bolsa como prompt, errorMessage y reglas de validación.
A continuación, se muestra un ejemplo del uso de esta variable para devolver la entrada del usuario actual en un mensaje de error de la entidad:
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
A continuación, se muestra un ejemplo del uso de varias definiciones system.entityToResolve. Entre ellas, se encuentra un mensaje definido para la propiedad text, que confirma una actualización realizada en un valor de entidad definido previamente mediante una directiva list de Apache FreeMarker y la propiedad updatedEntities.
    metadata:
      responseItems:        
      - type: "text" 
        text: "<#list system.entityToResolve.value.updatedEntities>I have updated <#items as ent>${ent.description}<#sep> and </#items>. </#list><#list system.entityToResolve.value.outOfOrderMatches>I got <#items as ent>${ent.description}<#sep> and </#items>. </#list>"
      - type: "text" 
        text: "${system.entityToResolve.value.prompt}"
        actions:
        - label: "${enumValue}"
          type: "postback"
          iteratorVariable: "system.entityToResolve.value.enumValues"
Para las acciones globales, esta variable controla la acción global Mostrar más con las propiedades needShowMoreButton, rangeStartVar y nextRangeStart:
        globalActions: 
        - label: "Show More"
          type: "postback" 
          visible:
            expression: "${system.entityToResolve.value.needShowMoreButton}"
          payload:
            action: "system.showMore"
            variables: 
              ${system.entityToResolve.value.rangeStartVar}: ${system.entityToResolve.value.nextRangeStart} 
        - label: "Cancel"
          type: "postback" 
          visible:
            onInvalidUserInput: true
          payload:
            action: "cancel"
La etiqueta Mostrar más debe incluir una propiedad system.showMore (action: "system.showMore"). De lo contrario, no funcionará.

Validación de mensaje de usuario

Los componentes de respuesta común validan el valor de texto libre proporcionado por el usuario que se define para la propiedad variable. Por ejemplo, si la propiedad variable está definida como un tipo primitivo (cadena, booleano, flotante, doble), estos componentes intentarán conciliar el valor con uno de los tipos primitivos. Cuando se define la propiedad de variable para una variable de tipo entidad, estos componentes llaman al motor de NLP para resolver el valor en una de las entidades. Sin embargo, cuando estos componentes no pueden validar un valor, el bot puede mostrar un mensaje de error. Al hacer referencia a la variable system.invalidUserInput, puede agregar un mensaje de error condicional a las respuestas del bot. Esta variable es un valor booleano, por lo que puede utilizarla como una condición con la directiva if de FreeMarker para mostrar el mensaje solo cuando un usuario introduzca un valor no válido. De lo contrario, el mensaje estará oculto. El estado AskPizzaSize de CrcPizzaBot al que se hace referencia en el siguiente fragmento muestra esto mediante la agregación de esta variable como condición en una plantilla FreeMarker evaluada por la directiva if. Dado que se ha definido en true, el bot agrega un mensaje de error al mensaje estándar (What size do you want? ) cuando el usuario introduce un valor no válido.
metadata:
  responseItems:
  - type: "text"
    text: "<#if system.invalidUserInput == 'true'>Invalid size, please try again.\
      \ </#if>What size do you want?"
    name: "What size"
    separateBubbles: true