Saya ingin menyimpan data percakapan ke akun penyimpanan atau DB kosmos. Dengan mencoba https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot- service-4.0&tabs=javascript#using-blob-storage

Saya dapat mengirim log ucapan ke penyimpanan gumpalan. Tetapi saya ingin menyimpan data percakapan ujung ke ujung yang mencakup data pengguna serta respons bot menggunakan javascript.

Saya mencoba menggunakan menyimpan status pengguna dan status percakapan tetapi tidak mencapai hasil yang diinginkan.

1
slashPriya 23 Maret 2020, 15:49

1 menjawab

Jawaban Terbaik

Saya membuat pencatat khusus (berdasarkan sampel sampel botduilder lama yang sudah tidak ada lagi) yang menyelesaikannya menggunakan TranscriptLoggerMiddleware. Saya memilih CosmosDB daripada Blob Storage karena saya merasa lebih mudah untuk menyimpan (dan mengambil) sebagai dokumen JSON. Tetapi Anda dapat mengubah konsep ini untuk menggunakan DB apa pun. Inilah yang saya lakukan.

Pertama, buat kode logger kustom Anda. Seperti yang disebutkan, saya menggunakan CosmosDB sehingga Anda mungkin harus mengubah beberapa hal jika Anda menggunakan DB yang berbeda. Waktu aktivitas menciptakan masalah konkurensi, jadi alih-alih mengatasinya, saya menyimpan objek transkrip secara lokal dan menimpa objek DB di setiap belokan. Mungkin bukan yang paling elegan, tetapi berhasil. Selain itu, saya menemukan bahwa fungsi tunggu saya diperlukan. Jika tidak, Anda hanya mendapatkan satu sisi percakapan. Saya telah diberitahu bahwa jenis fungsi tunggu ini bukan praktik terbaik, tetapi menunggu janji atau metode lain untuk membuat penundaan tidak berhasil untuk saya. Berikut kodenya:

customerLogger.js

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

const { CosmosDbStorage } = require('botbuilder-azure');
const path = require('path');

/**
 * CustomLogger, takes in an activity and saves it for the duration of the conversation, writing to an emulator compatible transcript file in the transcriptsPath folder.
 */
class CustomLogger {
    /**
     * Log an activity to the log file.
     * @param activity Activity being logged.
     */

    // Set up Cosmos Storage
    constructor(appInsightsClient) {
        this.transcriptStorage = new CosmosDbStorage({
            serviceEndpoint: process.env.COSMOS_SERVICE_ENDPOINT,
            authKey: process.env.COSMOS_AUTH_KEY,
            databaseId: process.env.DATABASE,
            collectionId: 'bot-transcripts'
        });

        this.conversationLogger = {};

        this.appInsightsClient = appInsightsClient;

        this.msDelay = 250;
    }


    async logActivity(activity) {

        if (!activity) {
            throw new Error('Activity is required.');
        }

        // Log only if this is type message
        if (activity.type === 'message') {

            if (activity.attachments) {
                var logTextDb = `${activity.from.name}: ${activity.attachments[0].content.text}`;
            } else {
                var logTextDb = `${activity.from.name}: ${activity.text}`;
            }

            if (activity.conversation) {
                var id = activity.conversation.id;
                if (id.indexOf('|') !== -1) {
                    id = activity.conversation.id.replace(/\|.*/, '');
                }

                // Get today's date for datestamp
                var currentDate = new Date();
                var day = currentDate.getDate();
                var month = currentDate.getMonth()+1;
                var year = currentDate.getFullYear();
                var datestamp = year + '-' + month + '-' + day;
                var fileName = `${datestamp}_${id}`;

                var timestamp = Math.floor(Date.now()/1);

                // CosmosDB logging (JK)
                if (!(fileName in this.conversationLogger)) {
                    this.conversationLogger[fileName] = {};
                    this.conversationLogger[fileName]['botName'] = process.env.BOTNAME;
                }

                this.conversationLogger[fileName][timestamp] = logTextDb;

                let updateObj = {

                    [fileName]:{
                        ...this.conversationLogger[fileName]
                    }

                }

                // Add delay to ensure messages logged sequentially
                await this.wait(this.msDelay);

                try {
                    let result = await this.transcriptStorage.write(updateObj);
                } catch(err) {
                    this.appInsightsClient.trackTrace({message: `Logger ${err.name} - ${path.basename(__filename)}`,severity: 3,properties: {'botName': process.env.BOTNAME, 'error':err.message,'callStack':err.stack}});
                }
            }
        }
    }
    async wait(milliseconds) {
        var start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
            if ((new Date().getTime() - start) > milliseconds) {
                break;
            }
        }
    }
}
exports.CustomLogger = CustomLogger;

Sekarang Anda perlu melampirkan ini ke adaptor botframework di file index.js Anda. Potongan kode yang relevan adalah:

index.js

const { TranscriptLoggerMiddleware } = require('botbuilder');
const { CustomLogger } = require('./helpers/CustomLogger');

//
//Your code to create your adapter, etc.
//

const transcriptLogger = new TranscriptLoggerMiddleware(new CustomLogger(appInsightsClient));
adapter.use(transcriptLogger);

Saya berasumsi di sini Anda sudah mengetahui file index.js Anda, tetapi jika Anda memerlukan bantuan untuk menyiapkannya dan membuat logger transkrip bekerja dengannya, beri tahu saya.

EDIT: Berdasarkan permintaan, inilah tampilan objek di CosmosDB. Biasanya saya akan menampilkan "dari nama", tetapi karena cara saya menguji bot itu datang melalui "tidak terdefinisi".

{
    "id": "2020-3-21_IfHK46rZV42KH5g3dIUgKu-j",
    "realId": "2020-3-21_IfHK46rZV42KH5g3dIUgKu-j",
    "document": {
        "botName": "itInnovationBot",
        "1584797671549": "Innovation Bot: Hi! I'm the IT Innovation Bot. I can answer questions about the innovation team and capture your innovation ideas. Let me know how I can help!",
        "1584797692355": "undefined: Hello",
        "1584797692623": "Innovation Bot: Hello.",
        "1584797725223": "undefined: Tell me about my team",
        "1584797725490": "Innovation Bot: The innovation team is responsible for investigating, incubating, and launching new technologies and applications. The innovation focus areas are:\n\n* Chatbots\n\n* Augmented Reality/Virtual Reality\n\n* Blockchain\n\n* Robotic Process Automation\n\n* AI & Machine Learning\n\nLet me know if you want to learn more about any of these technologies!",
        "1584797746279": "undefined: Thanks",
        "1584797746531": "Innovation Bot: You're welcome."
    },
    "_rid": "OsYpALLrTn2TAwAAAAAAAA==",
    "_self": "dbs/OsYpAA==/colls/OsYpALLrTn0=/docs/OsYpALLrTn2TAwAAAAAAAA==/",
    "_etag": "\"a4008d12-0000-0300-0000-5e7618330000\"",
    "_attachments": "attachments/",
    "_ts": 1584797747
}

Untuk membaca kembali percakapan (walaupun masih di tengah percakapan), Anda cukup membuat konektor di bot Anda, membuat ulang kunci, dan membaca file seperti di bawah ini (dalam hal ini id diteruskan ke dalam fungsi saya dan merupakan id percakapan):

    const transcriptStorage = new CosmosDbStorage({
        serviceEndpoint: process.env.COSMOS_SERVICE_ENDPOINT,
        authKey: process.env.COSMOS_AUTH_KEY,
        databaseId: process.env.DATABASE,
        collectionId: 'bot-transcripts',
        partitionKey: process.env.BOTNAME
    });

    // Get today's date for datestamp
    var currentDate = new Date();
    var day = currentDate.getDate();
    var month = currentDate.getMonth()+1;
    var year = currentDate.getFullYear();
    var datestamp = year + '-' + month + '-' + day;
    var filename = `${datestamp}_${id}`;

    var transcript = await transcriptStorage.read([filename]);
1
marc_s 14 Juni 2020, 11:15