Botframework-solutions: La actividad de actualización después de la migración a 0.8 no funciona

Creado en 20 may. 2020  ·  18Comentarios  ·  Fuente: microsoft/botframework-solutions

¿Qué proyecto se ve afectado?

Proyecto de Asistente Virtual y Proyecto de Habilidad.

¿En qué idioma es esto?

Mecanografiado.

¿Lo que sucede?

Desde el canal de MS Teams, al intentar actualizar una actividad desde una habilidad, el Asistente virtual fallará.

¿Cuáles son los pasos para reproducir este problema?

  1. Migre VA y Skill a la última versión 0.8 de Typescript
  2. En el VA tenemos que implementar una nueva clase "CustomSkillHandler" que extiende la clase "ChannelServiceHandler" (necesitamos implementar esto porque la función updateActivity no está implementada en el "SkillHandler" proporcionado)
  3. Dentro de "CustomSkillHandler" implemente onUpdateActivity :
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

y la función updateActivity ve así:

private async updateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, replyToActivityId: string, activity: Activity): Promise<ResourceResponse> {

        let skillConversationReference: SkillConversationReference;
        try {
            skillConversationReference = await this.conversationIdFactory.getSkillConversationReference(conversationId);
        } catch (err) {
            // If the factory has overridden getSkillConversationReference, call the deprecated getConversationReference().
            // In this scenario, the oAuthScope paired with the ConversationReference can only be used for talking with
            // an official channel, not another bot.
            if (err.message === 'Not Implemented') {
                const conversationReference = await this.conversationIdFactory.getConversationReference(conversationId);
                skillConversationReference = {
                    conversationReference,
                    oAuthScope: JwtTokenValidation.isGovernment(this.channelService) ?
                        GovernmentConstants.ToChannelFromBotOAuthScope :
                        AuthenticationConstants.ToChannelFromBotOAuthScope
                };
            } else {
                // Re-throw all other errors. 
                throw err;
            }
        }

        if (!skillConversationReference) {
            throw new Error('skillConversationReference not found');
        }
        if (!skillConversationReference.conversationReference) {
            throw new Error('conversationReference not found.');
        }

        const activityConversationReference = TurnContext.getConversationReference(activity);

        const callback = async (context: TurnContext): Promise<void> => {
            const adapter: BotFrameworkAdapter = (context.adapter as BotFrameworkAdapter);
            // Cache the ClaimsIdentity and ConnectorClient on the context so that it's available inside of the bot's logic.
            context.turnState.set(adapter.BotIdentityKey, claimsIdentity);
            context.turnState.set(this.SkillConversationReferenceKey, activityConversationReference);
            activity = TurnContext.applyConversationReference(activity, skillConversationReference.conversationReference) as Activity;
            const client = adapter.createConnectorClient(activity.serviceUrl);
            context.turnState.set(adapter.ConnectorClientKey, client);

            context.activity.id = replyToActivityId;
            await context.updateActivity(context.activity);
            return;
        };
        AppCredentials.trustServiceUrl(skillConversationReference.conversationReference.serviceUrl);

        await (this.adapter as BotFrameworkAdapter).continueConversation(skillConversationReference.conversationReference, skillConversationReference.oAuthScope, callback);
        return { id: uuid() };
    }
  1. En el índice, cambie la declaración SkillHandler :
// Register the request handler.
const handler: CustomSkillHandler = new CustomSkillHandler(adapter, bot, skillConversationIdFactory, credentialProvider, authenticationConfiguration);
const skillEndpoint = new ChannelServiceRoutes(handler);
skillEndpoint.register(server, '/api/skills');

  1. Pruebe una actividad de actualización del canal de Teams.

¿Qué esperabas que sucediera?

La tarjeta se actualiza en Teams

¿Puede compartir algún registro, salida de error, etc.?

El error se muestra cuando el VA intenta actualizar la actividad de la función descrita anteriormente onUpdateActivity .

(node:13410) UnhandledPromiseRejectionWarning: Error: Failed to decrypt conversation id
    at new RestError (/Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1397:28)
    at /Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1849:37
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13410) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 10)

¿Alguna captura de pantalla o contexto adicional?

Equipos de canal

Bot Services Bug customer-replied-to customer-reported

Comentario más útil

Hola de nuevo @ Batta32 :) ¡También este parece resuelto! Mañana haré algunas pruebas más profundas, pero parece que estoy de acuerdo con los cambios en la clase Test Skill Handler que proporcionaste. ¡Gracias!

Todos 18 comentarios

Gracias @ tommyJimmy87 por informar de este problema, todavía lo estamos revisando. Tan pronto como tengamos alguna actualización, te responderemos 😊!

Hola, @ tommyjimmy87 , necesito que des pasos de reproducción adicionales de lo que estás haciendo para descubrir qué está mal, ya que no pudimos reproducir el problema que estás enfrentando.

  1. ¿Qué quieres decir con The Card is updated in Teams ?
  2. ¿Está utilizando Virtual Assistant y Skill en la versión TypeScript?
  3. ¿Puede proporcionar los pasos de conexión / comunicación entre Virtual Assistant & Skill y cómo está probando el CustomSkillHandler ?
  4. ¿Está utilizando el [email protected] para generar el Asistente virtual y la habilidad?

Aquí está la rama con nuestros últimos cambios que hicimos para reproducir este problema.

Medio ambiente

Pasos de reproducción

  1. Implemente un VA & Skill usando generator-bot-virtualassistant
  2. Conecte el VA & Skill usando el comando botskills connect
  3. Cree una nueva clase CustomSkillHandler que se extienda desde ChannelServiceHandler
  4. Agregue los métodos onUpdateActivity y updateActivity en el CustomSkillHandler
  5. Modifique el archivo de índice para recibir CustomSkillHandler
  6. Pruebe la conexión entre el Asistente virtual y Skill usando el canal de Teams

¡Estaremos atentos a tu respuesta!

Hola @ Batta32 , intentaré responder a tus preguntas:

  1. Quiero decir que estoy tratando de actualizar un adaptive card en el canal de MS Teams y el resultado debería ser que la tarjeta se actualice después de que hice alguna acción (la tarjeta está dentro de la habilidad, así que básicamente la prueba es updateActivity de la habilidad al VA).

  2. Sí, tanto VA como Skill están en TypeScript

  3. En la habilidad tengo un adaptive card , después de una acción del usuario, esta tarjeta debe actualizarse con contenido diferente. Desde la habilidad llamo updateActivity :

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity es la actividad que queremos actualizar, guardamos la actividad en el estado para poder actualizarla posteriormente. Esto solía funcionar en la versión anterior, pero el flujo de la actividad de envío y actualización, según tengo entendido, cambió con la nueva versión.

Esto llamará al punto final de VA (esto está funcionando) que luego debería actualizar la actividad. La llamada entra en el método CustomSkillHandler en el método onUpdateActivity pero luego aparece el error cuando la actividad se envía a MS Teams.

  1. No, lamentablemente nuestro proyecto ya está en un estado avanzado y necesitaba migrar a la nueva versión manteniendo todas las cosas personalizadas que hicimos, básicamente, migramos manualmente. Lo cual no es genial, pero es necesario.

Avíseme si necesita más contexto, mientras tanto, tal vez pueda probar esto también en su sucursal y verificar si tengo el mismo error.

Hola @ Batta32 , lo probé desde la rama que estás usando para probar. Creé una bifurcación aquí: https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
Cambié tu rama para reproducir el mismo error. Dentro de testSkillHandler agregué un try-catch para obtener el error:

            try{
                await context.updateActivity(activity);
            }catch(e){
                console.log(e);
            }

Este es el error real que recibo de la llamada updateActivity :

{ body: '{"error":{"code":"ServiceError","message":"Unknown"}}',
     headers: HttpHeaders { _headersMap: [Object] },
     status: 400 },
  body: { error: { code: 'ServiceError', message: 'Unknown' } } }

Que es lo mismo que obtengo en mi proyecto.
Esta es la prueba que hice:

  1. Creé un nuevo Diálogo dentro de la habilidad de muestra testUpdateActivityDialog donde en el beginDialog envío un TestCard con un texto. En el onContinueDialog envío la misma tarjeta pero con un texto diferente;

  2. Conecte el VA a la Habilidad.

  3. Llame al VA con alguna intención que llamará a la Habilidad e iniciará el Diálogo de prueba y mostrará la tarjeta;

  4. Llame al VA con alguna intención que llame a la Habilidad y al continueDialog del Diálogo de prueba;

  5. La habilidad llamará al VA para actualizar la tarjeta y luego obtendrá el error.

¡Genial @ tommyJimmy87 ! Lo revisaremos con esta nueva información, muchas gracias 😊.

¡Hola @ tommyJimmy87! Reproducimos con éxito el escenario utilizando sus últimos cambios y los pasos de reproducción mencionados.

Seguiremos investigando sobre este tema. Tan pronto como tengamos alguna actualización, te responderemos 😊.

_Probamos la conexión entre VA y los bots de habilidades detectando el mismo problema cuando las habilidades envían la información de la actividad a la VA_
image

Hola @ DiegoCardozo94 ,

Gracias por la actualización.

¿Tiene alguna idea de cuándo podría lanzarse esto?
¿Crees que esto se puede publicar antes del 17, ya que tenemos un lanzamiento estrictamente de nuestro lado, nos gustaría saber si la fecha del 17 es factible o no? :)

Gracias

Hola @ tommyJimmy87 , perdón por el retraso.

Logramos validar que este problema también ocurre en C #, por lo que parece no estar relacionado solo con TypeScript.

Encontramos muchos problemas relacionados :

  1. microsoft / botframework-sdk # 5919: detalla que SkillHandler genera un ResourceResponse falso cuando reenvía actividades de la habilidad al canal. Esto significa que operaciones como update y delete no funcionarán .
  2. microsoft / botbuilder-dotnet # 3686: detalla que la clase SkillHandler no implementa OnUpdateActivityAsync .
    Si la habilidad se ejecuta sin un asistente virtual, las tarjetas se actualizan correctamente, pero cuando se ejecuta conectado a un asistente virtual, las tarjetas no se actualizan.
    Este problema tiene un comentario que dice que este problema debería solucionarse en la próxima versión . Puede rastrear el estado del trabajo en este microsoft / botframework-sdk # 5788.
  3. officedev / botbuilder-microsoftteams # 124: detalla que el uso de un bot V3 en los canales de Teams falla con HTTP 400 Bad Request (similar a este problema).

Por último, pero no menos importante, validamos los siguientes escenarios utilizando los pasos mencionados:

  • [funciona] Habilidad de TypeScript solo
  • [problema reproducido] Asistente virtual de TypeScript conectado a la habilidad de TypeScript
  • [problema reproducido] Asistente virtual de TypeScript conectado a la habilidad C #
  • [problema reproducido] C # Virtual Assistant conectado a la habilidad de TypeScript
  • [problema reproducido] Asistente virtual de C # conectado Habilidad de C #

@darrenj, replicamos este problema usando C # los robots también.

Nuestro entorno de prueba:

  • Rama con nuestras modificaciones
  • Ejemplo de asistente virtual de C #
  • Ejemplo de habilidad de C #

Nuestros pasos de reproducción :

  1. Implementar ambas muestras
  2. Configurar el asistente virtual con Ngrok
  3. Conecte el asistente virtual con Microsoft Teams
  4. Conecta la habilidad con el asistente virtual
  5. Ejecute ambas muestras
  6. En Microsoft Teams, envíe un saludo al Asistente virtual y complete el OnboardingDialog
  7. Enviar cuadro de diálogo de muestra de ejecución, el Asistente virtual responderá con una tarjeta con el texto Enviar actividad
  8. Envíe otro mensaje al Asistente virtual, lanzará una excepción al intentar actualizar la actividad

_El Asistente Virtual lanzará una excepción al intentar actualizar una actividad_
image

_TypeScript Skill ejecutándose con éxito en Microsoft Teams Channel, actualizando la tarjeta que se envió previamente_
image

Hola, https://github.com/microsoft/botframework-sdk/issues/5919 se ha abordado en los 3 idiomas admitidos, puede probar si esa solución ayuda a usar una de las compilaciones diarias a partir de mañana.

Hola @ Batta32 , aquí hay algo que debes actualizar primero, ¿verdad? ¿No es algo que pueda probar ya?

¡Hola @ tommyJimmy87! Sí, validaremos lo que mencionó para TypeScript y C #.

Actualizaremos esta rama agregando las últimas actualizaciones e incorporando la compilación diaria botbuilder-v4-js-daily del SDK que contiene microsoft / botbuilder-js # 2489 y microsoft / botbuilder-dotnet # 4264.

Tan pronto como tengamos alguna actualización, te responderemos 😊.

Hola @ tommyJimmy87 , confirmamos con éxito que aplicando los cambios de microsoft / botbuilder-js # 2489 en el testSkillHandler se solucionó este problema y la actividad se actualizó correctamente usando el canal de Microsoft Teams.

Marque esta confirmación para identificar los cambios que debe aplicar en su testSkillHandler , específicamente en el método processActivity .

@darrenj & @gabog : C # también.

Nuestro entorno de prueba:

  • Rama con nuestras modificaciones
  • Ejemplo de asistente virtual de TypeScript
  • Muestra de habilidades de TypeScript

Pasos de reproducción:

  1. Implementar ambas muestras
  2. Configurar el asistente virtual con Ngrok
  3. Conecte el asistente virtual con Microsoft Teams
  4. Conecta la habilidad con el asistente virtual
  5. Ejecute ambas muestras
  6. En Microsoft Teams, envíe un saludo al Asistente virtual y complete el OnboardingDialog
  7. Enviar cuadro de diálogo de muestra de ejecución, el Asistente virtual responderá con una tarjeta con el texto Enviar actividad
  8. Envíe otro mensaje al Asistente Virtual, actualizará la tarjeta con el texto Actualizar Actividad

Más detalles

_Cambios realizados en el método processActivity de testSkillHandler_
image

_El Asistente Virtual de TypeScript se ejecuta con éxito en Microsoft Teams Channel, actualizando la tarjeta que se envió previamente_
image

¡Estaremos atentos a tu respuesta!

Hola @ Batta32 , gracias por la actualización, probaremos esto lo antes posible. Solo una pregunta de mi parte: ¿se ha cambiado alguna versión de la biblioteca o es solo la confirmación que publicaste anteriormente? Gracias

@ tommyJimmy87 - ¡Solo el compromiso que publicamos arriba!

Hola de nuevo @ Batta32 :) ¡También este parece resuelto! Mañana haré algunas pruebas más profundas, pero parece que estoy de acuerdo con los cambios en la clase Test Skill Handler que proporcionaste. ¡Gracias!

¡Gracias @ tommyJimmy87! Tan pronto como pueda confirmar esto, podemos cerrar este problema 😊.

¡Hola @ Batta32! Con mucho gusto podemos cerrar este problema :)

¡Gracias @ tommyJimmy87 por confirmar esto!

@darrenj : ¡podemos cerrar este problema ya que lo resolvió el equipo de SDK!

¿Fue útil esta página
0 / 5 - 0 calificaciones