Botframework-solutions: تحديث النشاط بعد الترحيل إلى 0.8 لا يعمل

تم إنشاؤها على ٢٠ مايو ٢٠٢٠  ·  18تعليقات  ·  مصدر: microsoft/botframework-solutions

ما المشروع المتأثر؟

مشروع مساعد افتراضي ومشروع مهارة.

بأي لغة هذه؟

المطبوع.

ماذا يحدث؟

من قناة MS Teams ، عند محاولة تحديث نشاط من إحدى المهارات ، سيخرج المساعد الظاهري بالخطأ.

ما هي خطوات إعادة إظهار هذه المشكلة؟

  1. قم بترحيل VA و Skill إلى أحدث إصدار 0.8 من Typescript
  2. في VA ، يتعين علينا تنفيذ فئة جديدة "CustomSkillHandler" والتي توسع فئة "ChannelServiceHandler" (نحتاج إلى تنفيذ ذلك لأن الوظيفة updateActivity لم يتم تنفيذها في "SkillHandler" المتوفرة)
  3. داخل "CustomSkillHandler" ، قم بتطبيق onUpdateActivity :
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

وتبدو الوظيفة updateActivity كما يلي:

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. في الفهرس ، قم بتغيير إعلان 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. اختبر نشاط تحديث من قناة الفرق.

ماذا كنت تتوقع أن يحدث؟

تم تحديث البطاقة في Teams

هل يمكنك مشاركة أي سجلات أو ناتج خطأ وما إلى ذلك؟

يظهر الخطأ عندما يحاول VA تحديث النشاط من الوظيفة الموصوفة سابقًا 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)

أي لقطات شاشة أو سياق إضافي؟

فرق القناة

Bot Services Bug customer-replied-to customer-reported

التعليق الأكثر فائدة

مرحبًا مرة أخرى @ Batta32 :) هذا أيضًا يبدو أنه تم حله! سأقوم ببعض الاختبارات الأكثر عمقًا غدًا ولكن يبدو أنني موافق على التغييرات في فئة "معالج مهارة الاختبار" التي قدمتها. شكرا!

ال 18 كومينتر

شكرًا @ tommyJimmy87 للإبلاغ عن هذه المشكلة ، ما زلنا

مرحبًا @ tommyjimmy87 ، إعادة بروز إضافية لما تفعله لمعرفة الخطأ حيث لا يمكننا إعادة إنتاج المشكلة التي تواجهها.

  1. ماذا تقصد بـ The Card is updated in Teams ؟
  2. هل تستخدم المساعد الافتراضي والمهارة في إصدار TypeScript؟
  3. هل يمكنك توفير خطوات الاتصال / الاتصال بين المساعد الافتراضي والمهارة وكيف تختبر CustomSkillHandler ؟
  4. هل تستخدم المولد[email protected] لإنشاء المساعد الافتراضي والمهارة؟

إليك الفرع الذي يحتوي على أحدث التغييرات التي أجريناها لإعادة إظهار هذه المشكلة.

بيئة

خطوات Repro

  1. انشر المساعد الافتراضي والمهارة باستخدام generator-bot-virtualassistant
  2. قم بتوصيل VA & Skill باستخدام الأمر botskills connect
  3. قم بإنشاء فئة
  4. إضافة onUpdateActivity و updateActivity الأساليب على CustomSkillHandler
  5. قم بتعديل ملف الفهرس ليصلك CustomSkillHandler
  6. اختبر الاتصال بين المساعد الظاهري والمهارة باستخدام قناة Teams

سنكون منتبهين لإجابتك!

مرحبًا @ Batta32 ، سأحاول الإجابة على أسئلتك:

  1. أعني أنني أحاول تحديث adaptive card في قناة MS Teams والنتيجة يجب أن تكون البطاقة محدثة بعد أن قمت ببعض الإجراءات (البطاقة ضمن المهارة ، لذلك الاختبار هو updateActivity من المهارة إلى VA).

  2. نعم ، كلا من VA و Skill موجودان في نقش

  3. في المهارة لدي adaptive card ، بعد إجراء من المستخدم ، يجب تحديث هذه البطاقة بمحتوى مختلف. من المهارة التي أسميها updateActivity :

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity هو النشاط الذي نريد تحديثه ، نقوم بحفظ النشاط في الحالة حتى نتمكن من تحديثه لاحقًا. يستخدم هذا للعمل في الإصدار السابق ، ولكن تدفق نشاط الإرسال والتحديث بقدر ما أفهم تغير مع الإصدار الجديد.

سيؤدي هذا إلى استدعاء نقطة نهاية VA (هذا يعمل) والتي يجب أن تقوم بعد ذلك بتحديث النشاط. تأتي المكالمة إلى CustomSkillHandler في طريقة onUpdateActivity ولكن بعد ذلك أتلقى الخطأ عند إرسال النشاط إلى MS Teams.

  1. لا ، للأسف مشروعنا في حالة متقدمة بالفعل وكنت بحاجة إلى الانتقال إلى الإصدار الجديد مع الحفاظ على جميع العناصر المخصصة التي قمنا بها ، بشكل أساسي ، قمنا بالترحيل يدويًا. وهي ليست كبيرة ولكنها ضرورية.

اسمحوا لي أن أعرف إذا كنت بحاجة إلى مزيد من السياق ، في غضون ذلك ، ربما يمكنني تجربة ذلك أيضًا على فرعك والتحقق مما إذا كان لدي نفس الخطأ.

مرحبًا @ Batta32 ، لقد اختبرت ذلك من الفرع الذي تستخدمه للاختبار. لقد أنشأت شوكة هنا: https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
لقد غيرت فرعك لإعادة إنتاج نفس الخطأ. ضمن testSkillHandler أضفت المحاولة للحصول على الخطأ:

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

هذا هو الخطأ الفعلي الذي أحصل عليه من المكالمة updateActivity :

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

وهو نفس الشيء الذي أحصل عليه في مشروعي.
هذا هو الاختبار الذي قمت به:

  1. لقد أنشأت حوارًا جديدًا داخل نموذج المهارة testUpdateActivityDialog حيث في البداية أرسل TestCard مع نص. في onContinueDialog أرسل نفس البطاقة ولكن بنص مختلف ؛

  2. قم بتوصيل VA بالمهارة.

  3. اتصل بـ VA بقصد من شأنه أن يستدعي المهارة ويبدأ اختبار الحوار وإظهار البطاقة ؛

  4. اتصل بـ VA مع بعض النية التي ستستدعي المهارة و continueDialog من مربع حوار الاختبار ؛

  5. ستستدعي المهارة VA لتحديث البطاقة ثم تحصل على الخطأ.

@ tommyJimmy87 عظيم! سنراجعها بهذه المعلومات الجديدة ، شكرا جزيلا لك 😊.

مرحبا @ tommyJimmy87! أعدنا إنتاج السيناريو بنجاح باستخدام أحدث التغييرات وخطوات إعادة الإنتاج المذكورة.

سنواصل البحث حول هذه المسألة. بمجرد حصولنا على أي تحديث ، سنعود إليك 😊.

_ اختبرنا الاتصال بين VA وروبوتات المهارة التي تكتشف نفس المشكلة عندما ترسل المهارات معلومات النشاط إلى VA_
image

مرحبًا @ DiegoCardozo94 ،

شكرا للتحديث.

هل لديك أي فكرة عن موعد إصدار هذا؟
هل تعتقد أنه يمكن إصدار هذا قبل اليوم السابع عشر ، نظرًا لأن لدينا إصدارًا صارمًا من جانبنا ، نود فقط أن نفهم ما إذا كان التاريخ السابع عشر ممكنًا أم لا؟ :)

شكرا

مرحبًا @ tommyJimmy87 ، آسف على التأخير.

تمكنا من التحقق من أن هذه المشكلة تحدث في C # أيضًا ، لذا يبدو أنها ليست مرتبطة بـ TypeScript فقط.

وجدنا بعض المشكلات ذات الصلة :

  1. microsoft / botframework-sdk # 5919: يوضح بالتفصيل أن SkillHandler يولد ResourceResponse مزيفًا عندما يعيد توجيه الأنشطة من المهارة إلى القناة. هذا يعني أن عمليات مثل update و delete لن تعمل .
  2. microsoft / botbuilder-dotnet # 3686: توضح التفاصيل أن فئة SkillHandler لا تطبق OnUpdateActivityAsync .
    إذا تم تشغيل المهارة بدون مساعد افتراضي ، يتم تحديث البطاقات بشكل صحيح ، ولكن عند تشغيلها متصلاً بالمساعد الظاهري ، لا يتم تحديث البطاقات.
    تحتوي هذه المشكلة على تعليق يقول إنه يجب إصلاح هذه المشكلة في الإصدار التالي . يمكنك تتبع حالة العمل في هذا microsoft / botframework-sdk # 5788.
  3. officedev / botbuilder-microsoftteams # 124: يوضح بالتفصيل أن استخدام روبوت V3 في قنوات الفرق فشل مع HTTP 400 طلب سيء (مشابه لهذه المشكلة).

أخيرًا وليس آخرًا ، تحققنا من صحة السيناريوهات التالية باستخدام الخطوات المذكورة:

  • [يعمل] مهارة TypeScript وحدها
  • [نسخة مستنسخة] TypeScript Virtual Assistant المتصل بـ TypeScript Skill
  • [نسخة مستنسخة] TypeScript Virtual Assistant متصل C # Skill
  • [نسخة مستنسخة] C # المساعد الظاهري متصل مهارة TypeScript
  • [نسخة مستنسخة] C # المساعد الظاهري متصل C # مهارة

darrenj ، قمنا بتكرار هذه المشكلة باستخدام C # bots أيضًا.

بيئة الاختبار لدينا:

  • فرع مع تعديلاتنا
  • نموذج مساعد افتراضي C #
  • عينة المهارة C #

خطوات Repro لدينا:

  1. انشر كلا النموذجين
  2. قم بإعداد المساعد الافتراضي مع Ngrok
  3. قم بتوصيل المساعد الافتراضي بـ Microsoft Teams
  4. قم بتوصيل المهارة بالمساعد الظاهري
  5. قم بتشغيل كلتا العينات
  6. في Microsoft Teams ، أرسل مرحبًا إلى المساعد الظاهري وأكمل حوار OnboardingDialog
  7. إرسال نموذج تشغيل مربع الحوار ، سوف يستجيب المساعد الظاهري ببطاقة بها نص إرسال النشاط
  8. أرسل رسالة أخرى إلى المساعد الافتراضي ، وسوف يطرح استثناءً يحاول تحديث النشاط

_المساعد الظاهري سوف يطرح استثناء عند محاولة تحديث نشاط ما_
image

_تم تشغيل مهارة TypeScript بنجاح في قناة Microsoft Teams ، وتحديث البطاقة التي تم إرسالها مسبقًا_
image

مرحبًا ، https://github.com/microsoft/botframework-sdk/issues/5919 تم تناوله في جميع اللغات الثلاثة المدعومة ، يمكنك تجربة ما إذا كان هذا الحل يساعد في استخدام إحدى الإصدارات اليومية بدءًا من الغد.

مرحبًا @ Batta32 ، هنا شيء يجب عليك تحديثه أولاً ، أليس كذلك؟ إنه ليس شيئًا يمكنني تجربته بالفعل؟

مرحبا @ tommyJimmy87! نعم، نحن سيتم التحقق من صحة ماgabog المذكورة للنسخة مطبوعة على الآلة الكاتبة وC #.

سنقوم بتحديث هذا الفرع بإضافة آخر التحديثات ودمج botbuilder-v4-js-daily build SDK الذي يحتوي على Microsoft / botbuilder-js # 2489 و microsoft / botbuilder-dotnet # 4264.

بمجرد حصولنا على أي تحديث ، سنعود إليك 😊.

مرحبا @ tommyJimmy87، أكدنا بنجاح أن تطبيق التغييرات من مايكروسوفت / botbuilder-شبيبة # 2489 في testSkillHandler هذه المسألة يتم حلها ويتم تحديث النشاط بشكل صحيح باستخدام قناة فرق مايكروسوفت.

حدد هذا الالتزام لتحديد التغييرات التي يجب عليك تطبيقها في testSkillHandler الخاص بك ، وتحديدًا في طريقة processActivity .

darrenj & gabog - نجحنا في التحقق من صحة تغييرات Microsoft / botbuilder-dotnet # 4264 باستخدام C # bots أيضًا.

بيئة الاختبار لدينا:

  • فرع مع تعديلاتنا
  • نموذج مساعد ظاهري من TypeScript
  • نموذج مهارة TypeScript

خطوات Repro:

  1. انشر كلا النموذجين
  2. قم بإعداد المساعد الافتراضي مع Ngrok
  3. قم بتوصيل المساعد الافتراضي بـ Microsoft Teams
  4. قم بتوصيل المهارة بالمساعد الظاهري
  5. قم بتشغيل كلتا العينات
  6. في Microsoft Teams ، أرسل مرحبًا إلى المساعد الظاهري وأكمل حوار OnboardingDialog
  7. إرسال نموذج تشغيل مربع الحوار ، سوف يستجيب المساعد الظاهري ببطاقة بها نص إرسال النشاط
  8. أرسل رسالة أخرى إلى المساعد الافتراضي ، وسيقوم بتحديث البطاقة بنص تحديث النشاط

المزيد من التفاصيل

_التغييرات التي تم إجراؤها على طريقة نشاط العملية للاختبار
image

_تم تشغيل مساعد TypeScript الظاهري بنجاح في قناة Microsoft Teams ، وتحديث البطاقة التي تم إرسالها مسبقًا_
image

سنكون منتبهين لإجابتك!

مرحبًا @ Batta32 ، شكرًا على التحديث ،

@ tommyJimmy87 - فقط الالتزام الذي نشرناه أعلاه!

مرحبًا مرة أخرى @ Batta32 :) هذا أيضًا يبدو أنه تم حله! سأقوم ببعض الاختبارات الأكثر عمقًا غدًا ولكن يبدو أنني موافق على التغييرات في فئة "معالج مهارة الاختبار" التي قدمتها. شكرا!

شكرا @ tommyJimmy87! بمجرد تأكيد ذلك ، يمكننا إغلاق هذه المشكلة 😊.

مرحبا @ Batta32! يمكننا بكل سرور إغلاق هذه المشكلة :)

شكرا @ tommyJimmy87 لتأكيد ذلك!

darrenj - يمكننا إغلاق هذه المشكلة حيث تم حلها بواسطة فريق SDK!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات