Botframework-solutions: Respons bot tidak konsisten di saluran Teams

Dibuat pada 11 Nov 2019  ·  32Komentar  ·  Sumber: microsoft/botframework-solutions

  • Ketika kita mengatakan 'hai' , itu harus membalas kartu selamat datang sesuai alur kita (yang berfungsi dengan baik di saluran Webchat). Tapi itu memberikan kartu yang berbeda dan sepertinya ini di-cache.

Butuh bantuan Anda dalam hal ini.

Tolong beri tahu saya jika Anda memerlukan detail lebih lanjut tentang ini.

Terima kasih,
Sreekanth

Semua 32 komentar

@Virtual-Josh setidaknya kita mungkin perlu memastikan pelanggan memahami cara menggunakan debugging Sidecar di Emulator sehingga mereka dapat menguji lingkungan tim.

Hai @SreekanthOAuth ,

Ada beberapa hal yang perlu diketahui.

Pertama, Anda dapat menggunakan Emulator Kerangka Kerja Bot untuk men-debug bot Anda di dalam Teams. Di Emulator, Anda dapat membuka "Bantuan"-> "Memulai saluran (Pemeriksa Bot)" untuk melihat petunjuk cara menyiapkannya.

Kedua, Emulator akan bekerja seperti yang didokumentasikan dalam obrolan satu-ke-satu dan grup. Jika Anda mengalami masalah dengan itu, beri tahu kami.

Ketiga, ada bug dalam pesan dalam tim. Ketika Anda melakukan perintah /inspect GUID dalam tim, Anda harus merespons thread yang memiliki /inspect GUID jika Anda ingin melihat aktivitas pelacakan di Emulator. Saat ini logika di InspectionMiddleware tidak menangani aktivitas yang berasal dari obrolan tim Teams. Saya telah membuka masalah pada berbagai repo kami untuk menyelesaikan masalah tersebut. Anda dapat melihat masalah tersebut di sini:

https://github.com/microsoft/botbuilder-dotnet/issues/2955
https://github.com/microsoft/botbuilder-python/issues/428
https://github.com/microsoft/botbuilder-java/issues/142
https://github.com/microsoft/botbuilder-js/issues/1406

Beri tahu saya jika Anda memiliki pertanyaan lain.

Hai @Virtual-Josh, kami tidak melihat masalah apa pun di Emulator. Di sini Bot berfungsi seperti yang diharapkan.
Satu-satunya tempat di mana kami melihat masalah ini adalah di Saluran Teams.

Terima kasih,
Sreekanth

Saya ingin Anda memberi saya gambaran lengkap tentang apa yang Anda lakukan untuk mencari tahu apa yang salah. Berikut adalah beberapa pertanyaan awal yang sangat saya minati.

  1. Apakah Anda menjalankan bot ini dalam obrolan 1:1, obrolan grup, atau obrolan tim?
  2. Bagaimana Anda menginstal bot di Teams?
  3. Apakah Anda menggunakan salah satu Sampel kami, atau apakah ini kode Anda sendiri?

Atau Anda dapat melihat contoh yang kami miliki untuk Teams ( C# JS ) jika Anda ingin mencoba layanan mandiri.

Hai @SreekanthOAuth

Bot Tim akan menerima acara pembaruan percakapan saat pengguna pertama kali menambahkan bot untuk obrolan 1:1, atau bot ditambahkan ke tim. Bukan saat percakapan baru dibuat di tim atau anggota tim mengirim pesan ke bot. Jika pesan selamat datang dikirim dari OnMemberAdded pada ConversationUpdate: pesan tersebut tidak akan diaktifkan di Teams pada waktu yang sama seperti di emulator.

WebChat dan Emulator mengirim pembaruan percakapan saat mereka terhubung (karena keduanya membuat percakapan baru saat startup).

Anda dapat melacak siapa yang mengirim pesan ke bot, dan merespons dengan pesan selamat datang pada kontak pertama. Mekanisme ini tidak dibangun ke dalam SDK, jadi ini adalah sesuatu yang khusus yang perlu dikodekan di bot Anda.

@EricDahlvang - Maaf atas jawaban yang terlambat.

Oke. Biarkan saya memberikan beberapa rincian lebih lanjut tentang hal itu.

Kami memiliki Asisten Virtual dan keterampilan khusus. Saat pengguna meminta sesuatu, aliran beralih dari Asisten Virtual ke keterampilan masing-masing. Di dalam skill, ada metode dc.endDialog() di complete(). Fungsi ini dijalankan seperti yang diharapkan di Emulator, Webchat, dan saluran SMS. Tetapi berdasarkan analisis kami, ini tampaknya tidak berfungsi seperti yang diharapkan dalam tim. Konteksnya tidak dibersihkan. Sehingga kami melihat menu skill yang sama yang kami minta pertama kali setiap kali (walaupun Anda meminta maksud yang berbeda)

Membuat keterampilan khusus (dari TypeScript), berdasarkan dokumentasi di bawah ini,
https://microsoft.github.io/botframework-solutions/skills/tutorials/create-skill/typescript/3-create-your-skill/

Dan satu hal lagi adalah,

  • Saluran MSTeams berfungsi dengan baik sampai kami pindah ke Asisten Virtual dan Perutean Keterampilan. Sebelumnya, Asisten Virtual digunakan untuk menangani semua fungsi (berdasarkan maksud menunjukkan dialog) di dalam VA itu sendiri. Jadi menganggap ini adalah perubahan besar untuk menghadapi masalah ini.

Silakan menyarankan ini.

Terima kasih,
Sreekanth

Saya melihat masalah ini yang membahas masalah serupa dan solusinya di C#bot namun kami membutuhkan solusi untuk bot TypeScript.

https://github.com/microsoft/botframework-sdk/issues/4774

Hai @gabog karena sekarang kita sedang membicarakan keterampilan, bisakah kamu melihat tiket ini untuk membantu menyelesaikannya?

Hai @SreekanthOAuth ,

Saya akan memindahkan masalah ini ke repo solusi botframework karena masalah intinya adalah perutean VA/Keterampilan.

@SreekanthOAuth - Kami telah memperbarui template VA dan

@lauren-mills - Terima kasih atas pembaruannya.

Kami telah bekerja di Asisten Virtual sejak dari 5 bulan. Jadi kami memiliki banyak pembaruan untuk VA kami.
Akan sangat membantu jika Anda dapat memberikan perincian tentang perubahan besar apa yang terjadi untuk membuatnya berfungsi.

Kami berada di TypeScript

Terima kasih,
Sreekanth

Pembaruan telah dilakukan pada template C#, dan akan segera hadir di template TypeScript. Perubahan utama adalah mewarisi dari TeamsActivityHandler alih-alih IBot di kelas DialogBot. Ini file dalam template C#, dan saya yakin perubahan TypeScript harus sama, tetapi beri tahu saya jika Anda mengalami masalah. https://github.com/microsoft/botframework-solutions/blob/master/templates/Virtual-Assistant-Template/csharp/Sample/VirtualAssistantSample/Bots/DefaultActivityHandler.cs

Terima kasih atas pembaruannya. Kami akan mencoba dan menghubungi Anda kembali.

Terima kasih,
Sreekanth

Kami melihat DialogBot diperluas dari ActivityHandler di asisten virtual saat ini.

https://github.com/microsoft/botframework-solutions/blob/master/templates/Virtual-Assistant-Template/typescript/samples/sample-assistant/src/bots/dialogBot.ts

Kami tidak menemukan 'TeamsActivityHandler' di 'botbuilder' NPM paket.

Dan, di bawah ini ada beberapa pertanyaan lagi
Apakah perubahan ini hanya untuk Virtual Assistant atau bahkan untuk skill juga?
Perubahan ini tidak khusus untuk saluran Teams, bukan? Jika tidak, bagaimana pengaruhnya/bekerja pada saluran lain?

Tolong beri tahu saya jika Anda memerlukan detail lebih lanjut tentangnya.

Terima kasih,
Sreekanth

Saya dapat melihat teamsActivityHandler di sumber untuk botbuilder-js di sini . Bisakah Anda memastikan Anda menggunakan versi 4.6?

Perubahan ini harus dilakukan di bot mana pun yang akan langsung diakses melalui tim. Jika Anda berencana untuk mengekspos keahlian Anda secara langsung (bukan melalui VA), Anda juga memerlukan perubahan ini untuk mengaktifkan penanganan aktivitas Teams. Jika tidak, tidak penting untuk memperbarui proyek keterampilan.

Selain itu, terlepas dari namanya, pengendali aktivitas ini akan berfungsi untuk semua saluran lain selain Teams. Itu hanya menambahkan penanganan Tim tambahan.

Setelah menginstal versi terbaru, melihat pengecualian saat memulai server. Bisakah Anda menyarankan kami tentang ini.
error.txt

@Batta32 - dapatkah Anda melihat log kesalahan di atas dan memberikan saran?

Hai @SreekanthOAuth , kami mengajukan beberapa pertanyaan terkait dengan instalasi yang Anda buat.

  1. Dapatkah Anda memverifikasi bahwa Anda menginstal versi berikut?
    A. botbuilder perpustakaan - 4.6.2
    B. botbuilder-skills - 4.4.9
    C. botbuilder-solutions - 4.4.9
  2. Sudahkah Anda menghapus file package-lock.json dan folder node_modules sebelum instalasi? Jika tidak, harap hapus, perbarui versi perpustakaan ke yang terbaru dan jalankan instalasi lagi.

Masalahnya mungkin terkait dengan perbedaan versi botbuilder di dalam Asisten Virtual dengan versi botbuilder-solutions dan botbuilder-skills .

Kami akan memperhatikan jawaban Anda 😊.

@Batta32 , Terima kasih untuk detailnya.

Hari ini, kami telah mencoba ini dan tidak melihat kesalahan saat memulai server. Tapi kami melihat masalah saat kami meminta ucapan di saluran tim,

Dan mendapatkan kode staus sebagai 501 yang berarti TIDAK_DITERAPKAN

Error: at DefaultAdapter.<anonymous> (at DefaultAdapter.<anonymous> (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:640:27)at DefaultAdapter.<anonymous> (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:640:27): D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.jsat DefaultAdapter.<anonymous> (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:640:27): 640) at fulfilled (at fulfilled (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:11:58)at fulfilled (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:11:58): D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.jsat fulfilled (D:\home\site\wwwroot\node_modules\botbuilder\lib\botFrameworkAdapter.js:11:58): 11) at process._tickCallback (at process._tickCallback (internal/process/next_tick.js:68:7)at process._tickCallback (internal/process/next_tick.js:68:7): internal/process/next_tick.jsat process._tickCallback (internal/process/next_tick.js:68:7): 68)

Berdasarkan log ini dan analisis kami, tampaknya Jenis Aktivitas berjalan sebagai Invoke dan di dalam kode di bawah ini, itu gagal.

processActivity(req, res, logic) { return __awaiter(this, void 0, void 0, function* () { let body; let status; let processError; try { // Parse body of request status = 400; const request = yield parseRequest(req); // Authenticate the incoming request status = 401; const authHeader = req.headers.authorization || req.headers.Authorization || ''; yield this.authenticateRequest(request, authHeader); // Process received activity status = 500; const context = this.createContext(request); context.turnState.set(botbuilder_core_1.BotCallbackHandlerKey, logic); yield this.runMiddleware(context, logic); // Retrieve cached invoke response. if (request.type === botbuilder_core_1.ActivityTypes.Invoke) { const invokeResponse = context.turnState.get(exports.INVOKE_RESPONSE_KEY); **if (invokeResponse && invokeResponse.value) {** const value = invokeResponse.value; status = value.status; body = value.body; } **else { status = 501; }** } else { status = 200; } } catch (err) { // Catch the error to try and throw the stacktrace out of processActivity() processError = err; body = err.toString(); } // Return status res.status(status); if (body) { res.send(body); } res.end(); // Check for an error if (status >= 400) { if (processError && processError.stack) { throw new Error( BotFrameworkAdapter.processActivity(): ${status} ERROR\n ${processError.stack} ); } else { throw new Error( BotFrameworkAdapter.processActivity(): ${status} ERROR ); } } }); }

Bisakah Anda menyarankan kami tentang ini.

Terima kasih,
Sreekanth

Hai @SreekanthOAuth , kami mengajukan beberapa pertanyaan untuk mencari tahu apa yang salah.

  1. Bisakah Anda membagikan seluruh file log dengan kesalahan jika tersedia?
  2. Bisakah Anda memverifikasi jika masalah ini terjadi menggunakan Emulator?
  3. Apakah ini terjadi untuk setiap maksud yang ingin Anda jalankan atau untuk maksud tertentu? (misalnya maksud yang memerlukan akses otentikasi)
  4. Apakah dialogBot Anda diperluas ke ActivityHandler atau TeamsActivityHandler ?

Hai @Batta32 , temukan jawabannya di bawah ini

1.Dapatkah Anda membagikan seluruh file log dengan kesalahan jika tersedia?
_Dalam aliran log melihat respons di bawah_

image

2.Dapatkah Anda memverifikasi jika masalah ini terjadi menggunakan Emulator?
_Ya, ini berfungsi dengan baik di saluran Emulator dan Webchat_
3.Apakah ini terjadi untuk setiap maksud yang ingin Anda jalankan atau untuk maksud tertentu? (misalnya maksud yang memerlukan akses otentikasi)
_Langkah pertama di bot kami adalah Masuk. Karena gagal, langkah pertama tidak yakin apakah kasus ini sama untuk semua atau tidak.
4.Apakah dialogBot Anda diperluas ke ActivityHandler atau TeamsActivityHandler?
_Ini diperluas dengan TeamsActivityHandler_

Hai @SreekanthOAuth , maaf atas keterlambatannya. Kami berhasil mereproduksi skenario Anda yang kami pecahkan dengan mengganti metode handleTeamsSigninVerifyState pada DialogBot yang diperluas TeamsActivityHandler . Seperti yang Anda lihat di TeamsActivityHandler , ini berisi beberapa metode yang tidak diterapkan, yang harus kita timpa.

Dengan ini, dapatkah Anda memberi tahu kami jika Anda menerapkan metode handleTeamsSigninVerifyState di kelas yang mengimplementasikan TeamsActivityHandler ? Jika tidak, Anda dapat menggunakan kode di bawah ini:

public async handleTeamsSigninVerifyState(context: TurnContext, state: SigninStateVerificationQuery): Promise<void> {
    await this.dialog.run(context, this.state);
}

Untuk mencapai ini, kami mengikuti langkah - Contoh Asisten Virtual :

  1. Ubah DialogBot.ts untuk memperpanjang TeamsActivityHandler
  2. Pada DialogBot , terapkan metode handleTeamsSigninVerifyState overriden seperti yang ditunjukkan dalam Sampel Auth Tim
  3. Jalankan Contoh Asisten Virtual di Teams dan pastikan itu menerima jenis permintaan Invoke di botFrameworkAdapter .
    Catatan: Ini penting karena jenis Invoke diterima hanya saat masuk dari saluran Teams.

handleTeamsSigninVerifyState diganti dipanggil setelah masuk di Teams, alih-alih await bot.run(turnContext); ditemukan di index.ts .
Jika metode ini tidak diterapkan, itu akan default untuk menggunakan posting server dalam indeks, dan itu menyebabkan context.turnState.get() di botFrameworkAdapter mengembalikan invokeResponse dengan status 501 , yang pada gilirannya digunakan untuk membuat dan mengirim respons dengan status tersebut.

Konteks Tambahan

_Skenario direproduksi_
image

Kami harap ini membantu Anda 😊.

Hai @Batta32 , terima kasih atas pembaruannya.

Saya telah mencoba menambahkan perubahan ini tetapi mendapatkan beberapa kesalahan

Setelah menambahkan perubahan, file dialogBot.ts

`

impor {
Pengendali Aktivitas,
BotTelemetriKlien,
keadaan percakapan,
Kode Akhir Percakapan,
Kerasnya,
SigninStateVerificationQuery,
TeamsActivityHandler,
PutarKonteks,
StatePropertyAccessor} dari 'botbuilder';
impor {
Dialog,
DialogKonteks,
DialogSet,
keadaan dialog,
DialogTurnResult } dari 'botbuilder-dialogs';

kelas ekspor DialogBotmemperluas TeamsActivityHandler {
telemetriClient hanya-baca pribadi: BotTelemetryClient;
private readonly solutionName: string = 'Bantuan Virtual Ecolab';
rootDialogId hanya bisa dibaca pribadi: string;
dialog hanya-baca pribadi: DialogSet;
dialog hanya-baca pribadi: Dialog;
dialog readonly pribadiState: StatePropertyAccessor;

constructor(
    conversationState: ConversationState,
    telemetryClient: BotTelemetryClient,
    dialog: T) {
    super();

    this.rootDialogId = dialog.id;
    this.telemetryClient = telemetryClient;
    this.dialogState = conversationState.createProperty<DialogState>(this.solutionName); // new one
    this.dialogs = new DialogSet(this.dialogState);
    this.dialogs.add(dialog);
    this.onTurn(this.turn.bind(this));
    this.dialog = dialog; // new one
}

//tslint:disable-next-line: no-any
public async turn(turnContext: TurnContext, next: () => Promise<void>): Promise<any> {
    // Client notifying this bot took to long to respond (timed out)
    if (turnContext.activity.code === EndOfConversationCodes.BotTimedOut) {
        this.telemetryClient.trackTrace({
            message: `Timeout in ${ turnContext.activity.channelId } channel: Bot took too long to respond`,
            severityLevel: Severity.Information
        });

        return;
    }

    const dc: DialogContext = await this.dialogs.createContext(turnContext);

    if (dc.activeDialog !== undefined) {
        const result: DialogTurnResult = await dc.continueDialog();
    } else {
        await dc.beginDialog(this.rootDialogId);
    }

    await next();
}

public async handleTeamsSigninVerifyState(context: TurnContext, state: SigninStateVerificationQuery): Promise<void> {
    await this.dialog.run(context, this.dialogState); // getting error here.
}

}

`

Di sini wrt dialog dan dialogState membuat atribut baru.
Di this.dialog tidak ada run() .

Bisakah Anda menyarankan.

Terima kasih,
Sreekanth

Hai @SreekanthOAuth! Jika Anda tidak dapat menggunakan metode run, Anda harus menambahkan tipe untuk T yang berisi metode tersebut, sebagai berikut:

  1. Perbarui kelas DialogBot sebagai DialogBot<T extends MainDialog> extends TeamsActivityHandler atau langsung tentukan tipe konkret untuk dialog sebagai dialog: MainDialog .
  2. Terapkan metode run di MainDialog .

Anda dapat memeriksa perubahan tersebut di cabang yang kami Contoh Asisten Virtual yang dimodifikasi yang mengimplementasikan Masuk Tim.

Terakhir, Anda dapat melihat NodeJS Sample 46 untuk mengetahui cara mengimplementasikan metode run dengan dialog waterfall .

Beri tahu kami jika ini membantu atau Anda memiliki masalah lain 😊.

Tutup karena tidak aktif. Silakan buka kembali sesuai kebutuhan.

@lauren-mills , bisakah Anda membuka kembali masalah ini karena masalah masih ada.

Kami telah mencoba saran Anda berdasarkan komentar terbaru. Namun, kami masih menghadapi masalah.

Masalah sebenarnya di sini adalah,

  • Saluran tim MS tidak mendukung jenis aktivitas EndOfConversation yang dikembalikan dari bot keterampilan.

Harap beri tahu kami jika Anda memerlukan informasi tambahan.

Terima kasih,
Sreekanth Dari Ecolab.

Hai @SreekanthOAuth!

Kami sedang menyelidiki ini.

Hai @SreekanthOAuth ,

Kami dapat mereproduksi masalah Anda menggunakan cabang master , tetapi juga melakukan pengujian yang sama pada berikutnya dan berhasil tanpa masalah.

Ini adalah langkah-langkah yang kami ikuti untuk mereproduksi masalah:

  1. Terapkan Contoh Asisten Virtual
  2. Terapkan Keterampilan Sampel
  3. Buat Keterampilan Contoh , tetapi pastikan untuk menggunakan ucapan, pertanyaan, dan jawaban yang berbeda untuk membedakannya dari keterampilan pertama, seperti:
  4. Setelah men-deploy Asisten Virtual dan Keterampilan, hubungkan kedua Keterampilan ke Asisten Virtual menggunakan perintah botskills connect --remoteManifest "http://localhost:<SKILL_PORT>/api/skill/manifest" --luisFolder "<PATH_TO_LUIS_FOLDER>" --ts
  5. Mulai Asisten Virtual, dan jalankan ngrok menggunakan port yang sama dengan yang digunakan untuk menjalankan Asisten Virtual
    image
  6. Di Portal Azure, buka sumber daya bot Asisten Virtual, Pengaturan > Titik Akhir Pesan dan konfigurasikan URL ngrok
    image
  7. Buat manifest.json dari Asisten Virtual untuk menggunakannya di Teams dengan mengikuti langkah-langkah ini

    • Atau, gunakan manifes contoh Bot Percakapan Tim sebagai templat, beserta ikonnya

    • Pastikan untuk mengganti <<YOUR-MICROSOFT-APP-ID>> dengan appID Asisten Virtual

  8. Zip manifest.json dan file ikon, dan impor ke Teams
    image
  9. Inisialisasi aplikasi Asisten Virtual dan kirim ucapan Keterampilan Sampel pertama
  10. Setelah selesai dengan dialog air terjun dari Keterampilan Sampel, pengecualian akan dilemparkan:
    image
  11. Pengecualian dilemparkan ke dalam metode deserializeResponseBody() dari file deserializationPolicy di ms-rest-js :
    image

Kami juga melakukan tes yang sama menggunakan cabang berikutnya , dan masalahnya tidak ditemukan
image
Seperti yang dapat dilihat pada gambar di atas, setelah menyelesaikan dialog waterfall, Skill Sample pertama menyerahkan kendali ke Asisten Virtual, kemudian ucapan untuk Skill Sample kedua dikirim ( alternative ) dan itu dieksekusi dengan sukses, seperti yang dicatat oleh " Apa lagi yang bisa saya bantu? " yang dikirim oleh Asisten Virtual.

Catatan: Untuk menggunakan cabang next , Anda perlu membangun Solusi BotBuilder dan Keterampilan BotBuilder secara lokal, dan memperbarui package.json dari Asisten Virtual dan Keterampilan untuk menggunakan .tgz file, karena belum dirilis.

Ini berarti bahwa masalah ini akan diperbaiki dalam versi perpustakaan TypeScript yang akan segera dirilis.

Maaf untuk jawaban yang terlambat. Saya akan memeriksa dan memberikan pembaruan.

Hai @SreekanthOAuth ,
Cabang next telah digabungkan dengan cabang master .

Harap uji lagi dengan perubahan yang baru diterapkan.

Silakan buka kembali jika Anda mengalami masalah lagi

Silakan buka kembali ini. Kami mencoba memperbaiki berdasarkan saran "mengganti" ActivityType.EndOfConversation ke ActivityType.HandOff dan mengimplementasikan TeamActivityHander. Namun, masalah mendasar adalah EndOfConversation ActivityType tidak didukung oleh MSTeam. Kami benar-benar terjebak dan tidak bisa menjanjikan pemangku kepentingan internal kami untuk ketersediaan bot MSTeam.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat