Проблема в том, что две библиотеки имеют разные способы настройки прослушивателя, который обрабатывает объекты запроса / ответа, и настройки регистрации обработчика намерений.Вы не можете смешать два (как вы обнаружили).Вам нужно выбрать одну и преобразовать функции, зарегистрированные другим способом.
Чтобы сэкономить много времени на наборе текста, я буду ссылаться на библиотеку actions-on-google как aog, а также на библиотекуflowflow-Execution.as df.
Использование библиотеки actions-on-google
Вы могли бы инициализировать слушателя что-то вроде:
const app = dialogflow({
// REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
clientId: '<CLIENT ID>',
});
// Intent handler declarations go here
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Преобразование диалогового потокаОбработчики в стиле -fulfillment относительно просты.Объект aog conv
очень похож на объект df agent
.Оба, например, имеют метод add()
, который ведет себя одинаково при работе с действиями.
Объект conv
также имеет свойство parameters
, хотя использование второго аргумента в вызове функции является предпочтительным, оно содержит те же вещи.Точно так же у него есть свойство arguments
, которое содержит то же самое, что и третий аргумент, передаваемый обработчику.
Стоит также отметить, что app.intent()
не обязательно должна иметь свою функцию функции стрелкиили даже указанный в строке, как это.Вы можете написать функцию отдельно и просто передать ее в качестве параметра.
Таким образом, ваша makeAppointment()
функция может быть переписана и зарегистрирована как что-то вроде
function makeAppointment (conv) {
// Calculate appointment start and end datetimes (end = +1hr from start)
const dateTimeStart = new Date(Date.parse(conv.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
const appointmentTimeString = dateTimeStart.toLocaleString(
'en-US',
{ month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
);
// Check the availibility of the time, and make an appointment if there is time on the calendar
return createCalendarEvent(dateTimeStart, dateTimeEnd).then(() => {
conv.add(`Okay, I have you booked for ${appointmentTimeString}!`);
}).catch(() => {
conv.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
});
}
app.intent( 'Make Appointment', makeAppointment );
Использованиебиблиотека выполнения потока диалога
Вы уже настроили слушателя и обработчик таким образом
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
// Declare your functions here
let intentMap = new Map();
// Map intent name to functions here
agent.handleRequest(intentMap);
});
, поэтому вопрос заключается в том, как включить обработчики, которые, кажется, имеют специфическую информацию варгументы функции в df-совместимые обработчики.
У объекта df agent
есть способ получить (почти) эквивалентный conv
объект.Неудивительно, что это agent.getConv()
.В самом деле.Затем вы можете использовать свойства parameters
и arguments
, как указано выше, чтобы получить эквивалент второго и третьего аргументов функции.Вы будете использовать agent.add()
для добавления сообщения (вы также можете использовать conv
, но это немного сложнее).
Для обработчика «Get Signin» это может выглядеть примерно так:
function getSignin (agent){
let conv = agent.getConv();
let params = conv.parameters;
let signin = conv.arguments;
if (signin.status === 'OK') {
const payload = conv.user.profile.payload;
agent.ask(`Welcome back ${payload.name}. What do you want to do next?`);
} else {
agent.ask(`I won't be able to save your data, but what do you want to do next?`);
}
}
и затем убедитесь, что вы зарегистрировали обработчик в соответствующем месте
intentMap.set('Get Signin', getSignin);