Как исправить неправильный запрос при попытке отобразить историю чата с помощью BotFramework? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь отобразить историю чата пользователя с моим ботом, чтобы, когда они вернутся, они могли видеть свои предыдущие разговоры. Когда я пытаюсь использовать функцию " SendConversationHistory (chatId, transcripts) ", я получаю Bad Request (400) , и история не отображается в чат-боте. Кто-нибудь знает, как это исправить?

Я использую BotFramework SDK v.3 в C #.

Что я делаю: 1. Проверка наличия какого-либо идентификатора разговора для повторного подключения с использованием этого идентификатора разговора. 2. Я отправляю событие в бот, чтобы восстановить историю 3. Я могу выбрать предыдущие действия и создать стенограмму

После установки моей расшифровки я попробовал эту функцию SendConversationHistory, которая не работает.

Я могу общаться с ботом, даже если это не удается, используя старый идентификатор разговора. Я также попытался заставить бот сделать ReplyToActivity, и это работает.

Я слежу за примером js (v4) , этот вопрос о стековом потоке и этой теме об истории в github , но ни одна из них не помогла решить эту проблему выпуск.

MessageController.cs (в HandleSystemMessage)

else if (message.Name.Equals("restoreHistory"))
{
    string convId = message.Conversation.Id;
    List<Activity> activities = JsonConvert.DeserializeObject<List<Activity>>((string)message.Value);
    var incrementId = 0;

    if (message.Id.Contains("|"))
        int.TryParse(message.Id.Split('|')[1], out incrementId);

    foreach(var a in activities)
    {
        incrementId++;
        a.Id = string.Concat(convId, "|", incrementId.ToString().PadLeft(7, '0'));
        a.ChannelData = string.Empty;
    }

    if (activities != null && activities.Count > 0)
    {
        var connector = new ConnectorClient(new System.Uri(message.ServiceUrl));
        var transcripts = new Transcript(activities);
        connector.Conversations.SendConversationHistory(convId, transcripts);
    }
}

default.htm

var botConnection = new BotChat.DirectLine({
    secret: ...,
    conversationId: getPersistedConversationId(),
    token: params['t'],
    domain: params['domain'],
    webSocket: params['webSocket'] && params['webSocket'] === "true"
});
BotChat.App({
    botConnection: botConnection,
    user: { id: ... },
    bot: { id: ... },
    speechOptions: speechOptions
}, document.getElementById("BotChatGoesHere"));

botConnection.connectionStatus$
    .subscribe(function (connectionStatus) {
        switch (connectionStatus) {
            case 2:
                if (botConnection.conversationId === localStorage.getItem('conversationId')) {
                    botConnection.postActivity({
                        from: user,
                        type: 'event',
                        name: 'restoreHistory',
                        text: '',
                        value: localStorage.getItem('conversations')
                    }).subscribe(function (activityId) {
                        console.log('sending chat history.');
                    });
                } else {
                    saveConversationId(botConnection.conversationId);
                }
        }
    });

function saveConversationId(conversationId) {
    localStorage.setItem('conversationId', conversationId);
}
function getPersistedConversationId() {
    return localStorage.getItem('conversationId');
}

Я получаю следующие ошибки:

Exception thrown: 'Microsoft.Rest.TransientFaultHandling.HttpRequestWithStatusException' in Microsoft.Rest.ClientRuntime.dll
Response status code indicates server error: 400 (BadRequest).

Деятельность 'Json

[  
    {  
        "type":"message",
        "id":"6Tklwkie30H7oCI1eyWx9i-h|0000001",
        "timestamp":"2019-06-19T10:37:40.1175096Z",
        "channelId":"directline",
        "from":{  
            "id":"MyBotName",
            "name":"MyBotName"
        },
        "conversation":{  
            "id":"6Tklwkie30H7oCI1eyWx9i-h"
        },
        "text":"Hello, I'm MyBotName. How can I help you? To get started ask me a question.",
        "attachments":[  

        ],
        "entities":[  

        ],
        "replyToId":"7E6AtBm9iXL"
    },
    {  
        "type":"message",
        "id":"6Tklwkie30H7oCI1eyWx9i-h|0000003",
        "timestamp":"2019-06-19T10:37:43.4034223Z",
        "localTimestamp":"2019-06-19T10:37:43.2484146+00:00",
        "channelId":"directline",
        "from":{  
            "id":"MyBotName",
            "name":"MyBotName"
        },
        "conversation":{  
            "id":"6Tklwkie30H7oCI1eyWx9i-h"
        },
        "attachmentLayout":"carousel",
        "locale":"en-US",
        "text":"",
        "attachments":[  
            {  
                "contentType":"application/vnd.microsoft.card.hero",
                "content":{  
                    "title":"Title1",
                    "subtitle":"",
                    "text":"",
                    "images":[  
                        {  
                            "url":"http://..."
                        }
                    ],
                    "buttons":[  
                        {  
                            "type":"openUrl",
                            "title":"Button1",
                            "value":"https://..."
                        },
                        {  
                            "type":"openUrl",
                            "title":"Button2",
                            "value":"https://..."
                        }
                    ]
                }
            },
            {  
                "contentType":"application/vnd.microsoft.card.hero",
                "content":{  
                    "title":"Title2",
                    "subtitle":"",
                    "text":"",
                    "images":[  
                        {  
                            "url":"http://..."
                        }
                    ],
                    "buttons":[  
                        {  
                            "type":"openUrl",
                            "title":"Button1",
                            "value":"https://..."
                        },
                        {  
                            "type":"openUrl",
                            "title":"Button2",
                            "value":"https://..."
                        }
                    ]
                }
            },
            {  
                "contentType":"application/vnd.microsoft.card.hero",
                "content":{  
                    "title":"Title3",
                    "subtitle":"",
                    "text":"",
                    "images":[  
                        {  
                            "url":"http://..."
                        }
                    ],
                    "buttons":[  
                        {  
                            "type":"openUrl",
                            "title":"Button1",
                            "value":"https://..."
                        },
                        {  
                            "type":"openUrl",
                            "title":"Button2",
                            "value":"https://..."
                        }
                    ]
                }
            }
        ],
        "entities":[  

        ],
        "replyToId":"6Tklwkie30H7oCI1eyWx9i-h|0000000"
    },
    {  
        "type":"message",
        "id":"6Tklwkie30H7oCI1eyWx9i-h|0000000",
        "timestamp":"2019-06-19T10:37:33.8526334Z",
        "serviceUrl":"https://directline.botframework.com/",
        "channelId":"directline",
        "from":{  
            "id":"anonymous",
            "name":"Anonymous"
        },
        "conversation":{  
            "id":"6Tklwkie30H7oCI1eyWx9i-h"
        },
        "recipient":{  
            "id":"MyBotName@WI6mwV4z0jY",
            "name":"MyBotName"
        },
        "textFormat":"plain",
        "locale":"en-US",
        "text":"i'm looking for this",
        "entities":[  
            {  
                "type":"ClientCapabilities",
                "requiresBotState":true,
                "supportsTts":true,
                "supportsListening":true
            }
        ],
        "channelData":{  
            "clientActivityId":"1560940638882.6146258363791712.0"
        }
    }
]

1 Ответ

0 голосов
/ 06 июля 2019

Если вы отлаживаете в Visual Studio, вы можете нажать «Просмотреть подробности», чтобы увидеть весь объект исключения.

View Details

ДляErrorResponseException, вы можете увидеть фактическое сообщение об ошибке, которое было возвращено в ответе HTTP.В этом случае он говорит «Недопустимые действия», что дает понять, что что-то не так с действиями, которые вы пытаетесь отправить.

Invalid activities

ПолучаетсяВы не указываете получателя своей деятельности.Если вы укажете получателя, вы должны пройти исключение «BadRequest».

Однако : Есть еще несколько ошибок, с которыми вы можете столкнуться.Даже если вы не получите исключение, есть некоторые вещи, которые могут привести к сбою SendConversationHistory без ошибок, при этом не сообщая о том, почему ваши действия не отображаются в чате.

Ваша стратегия заполнениясвойство ID опасно, потому что ваш бот может отправить сообщение в разговор до вызова SendConversationHistory.Если ваш бот отправил сообщение пользователю в тот же ход, у него будет тот же идентификатор активности, который вы пытаетесь присвоить активности в истории разговоров.Это вызовет конфликт, и вы не увидите активности.Я рекомендую отформатировать идентификатор каким-либо уникальным способом, который не похож на значения идентификатора, которые автоматически генерирует Direct Line.

Мне удалось успешно отправить ваши действия, изменив код следующим образом:

foreach (var a in activities)
{
    incrementId++;
    // Use your own ID format
    a.Id = string.Concat("history|", incrementId.ToString().PadLeft(7, '0'));
    a.ChannelData = null;
    a.Conversation = new ConversationAccount(id: convId);

    if (a.From.Name == message.Recipient.Name)
    {
        // If the activity was from the bot, assign the user as the recipient
        a.Recipient = message.From;
        a.From = message.Recipient;
    }
    else
    {
        // If the activity was from the user, assign the bot as the recipient
        a.Recipient = message.Recipient;
        a.From = message.From;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...