К сожалению, в текущей версии набора навыков вы не можете изменить время ожидания. Этот тайм-аут фактически контролируется агентом (то есть клиентской стороной, приложением или поисковой службой).
Botframework поддерживает «печатание» сообщений; к сожалению, Кортана этого не делает (пока). Он также поддерживает проактивные сообщения (вне диапазона), а Кортана, к сожалению, не поддерживает (пока).
Но надежда есть! Это зависит от того, как вы построили свой диалог и какие подсказки для ввода вы используете, а также от того, какое устройство является вашим основным человеческим интерфейсом.
Например, в Windows вы можете использовать подсказку «acceptInput». Это означает, что беседа бесконечно ждет, пока пользователь что-то сделает. Часто это используется при представлении богатых карточек. Если вы пойдете по этому пути, ваш бот должен опросить о завершении задачи, а затем представить сообщение «Я все еще думаю» в ответ на ввод пользователя (на следующем ходу).
Вы говорите, что этот UX не очень хорош, потому что пользователь не знает, когда задача выполнена ... но вы можете использовать replaceDialog, когда задача завершена, чтобы вернуть поток диалога в нужное русло!
Если вы хотите дать активную обратную связь, что задача выполняется, вы можете это сделать! Используйте подсказку ignoringInput с сообщением «Пожалуйста, подождите». Создайте цикл, который опрашивает о завершении задачи, и отправляйте это сообщение каждые 5 секунд. ignoringInput заставляет бота перейти к следующему ходу, пока он не получит подсказку о принятии или ожидании ввода.
var restify = require('restify');
var builder = require('botbuilder');
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword,
openIdMetadata: process.env.BotOpenIdMetadata
});
// Listen for messages from users
server.post('/api/messages', connector.listen());
// Create your bot with a function to receive messages from the user
var bot = new builder.UniversalBot(connector);
bot.set('storage', new builder.MemoryBotStorage() );
const kWelcomeText = 'Hi! Say \'start\' to create a timer and a polling loop.';
const kMisunderstood = 'Sorry, I didn\'t get that.';
const kStarting = 'Starting 30 second timer. Please wait.';
const kWaiting = 'Please wait.';
const kDone = 'My task is done.';
bot.dialog('/', function (session) {
var txt = session.message.text;
if( !txt )
{
var msg = new builder.Message(session)
.text( kWelcomeText )
.speak( kWelcomeText )
.inputHint("acceptingInput");
session.send(msg);
return;
}
if( txt === 'start' )
{
console.log( 'entering pollerDialog' );
session.conversationData.counter = 0;
session.beginDialog('pollerDialog');
return;
}
else {
var msg = new builder.Message(session)
.text( kMisunderstood )
.speak( kMisunderstood )
.inputHint("acceptingInput");
session.send(msg);
return;
}
});
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
bot.dialog('pollerDialog', function (session) {
console.log( 'entering pollerDialog' );
var iter = session.conversationData.counter || 0;
session.conversationData.counter = iter + 1;
if( session.conversationData.done )
{
console.log( 'done' );
var msg = new builder.Message(session)
.text( kDone )
.speak( kDone )
.inputHint("acceptingInput");
session.endDialog(msg);
return;
}
console.log( `iteration is ${iter}` );
if( iter === 0 )
{
console.log( 'setting timeout' );
setTimeout(function () {
console.log( 'timeout done' );
session.conversationData.done = true;
}, 30000);
var msg = new builder.Message(session)
.text( kStarting )
.speak( kStarting )
.inputHint("ignoringInput");
session.sendTyping();
session.send(msg);
console.log( 'sent kStarting' );
setTimeout( function( ) {
console.log( 'replacing kStarting' );
session.replaceDialog('pollerDialog');
}, 5000);
sleep(4000);
return;
} else {
var msg = new builder.Message(session)
.text( kWaiting )
.speak( kWaiting )
.inputHint("ignoringInput");
session.sendTyping();
session.send(msg);
console.log( 'sent kWaiting' );
setTimeout( function( ) {
console.log( 'replacing kWaiting' );
session.replaceDialog('pollerDialog');
}, 5000);
sleep(4000);
return;
}
});
person
Micromuncher
schedule
28.01.2019