Контексты очень тесно связаны с SessionID.Например, у вас есть чат-бот, который запускается на двух компьютерах, обслуживающих двух разных пользователей.Каждый пользователь будет иметь соответствующий session_id (если вы кодируете в NODE, когда новый пользователь запускает чат-бота, вы должны убедиться, что он / она получит уникальный session_id).
Теперь каждый уникальный идентификатор сеанса будет иметь уникальный контекст.В приведенном выше примере, скажем, пользователь 1 инициализирует намерение, которое имеет входной контекст с именем «abc», с продолжительностью жизни 2, а пользователь 2 инициализирует другое намерение, которое имеет входной контекст с именем «xyz» с продолжительностью жизни 5, эти соответствующие контексты записываются противкаждый из этих идентификаторов сессии каждого пользователя.Вы можете программно контролировать (редактировать) контексты и их жизненный цикл.Это самое большое преимущество облегченного кода Dialogflow по сравнению с использованием GUI.Используя такие службы, как Firebase, вы также можете сохранить идентификаторы сеанса и связанные с ним контексты, чтобы в следующий раз при входе того же пользователя они могли начинать с того места, где они последний раз ушли.
Я могу поделиться фрагментом из одного из моихпредыдущие проекты, где я управлял контекстами программно.Сценарий инициализации выглядит следующим образом:
/**
* @author Pruthvi Kumar
* @email pruthvikumar.123@gmail.com
* @create date 2018-08-15 04:42:22
* @modify date 2018-08-15 04:42:22
* @desc Dialogflow config for chatbot.
*/
const dialogflow_config = {
projectId: 'xxx',
sessionId: 'chatbot-session-id', //This is default assignment. This will hve to be overridden by sessionId as obtained from client in order to main context per sessionId.
languageCode: 'en-US'
};
exports.configStoreSingleton = (function () {
let instanceStacks;
let instanceSessionId;
let contextStack = {};
let intentsStack = {};
let successfulIntentResponseStack = {};
function init() {
contextStack[dialogflow_config['sessionId']] = [];
intentsStack[dialogflow_config['sessionId']] = [];
successfulIntentResponseStack[dialogflow_config['sessionId']] = [];
return {
contextStack: contextStack,
intentsStack: intentsStack,
successfulIntentResponseStack: successfulIntentResponseStack
};
}
return {
init: function () {
if (!instanceStacks || (instanceSessionId !== dialogflow_config['sessionId'] && (!intentsStack[dialogflow_config['sessionId']]))) {
console.log('[dialogflow_config]: Singleton is not instantiated previously or New userSession is triggered! Fresh instance stack will be provisioned');
instanceStacks = init();
instanceSessionId = dialogflow_config['sessionId'];
}
return instanceStacks;
}
};
})();
exports.updateSessionIdOfDialogflowConfig = function (sessionId) {
if (typeof (sessionId) === 'string') {
dialogflow_config['sessionId'] = sessionId;
return true;
} else {
console.warn('[dialogflow_config]: SessionId must be of type STRING!');
return;
}
};
exports.getDialogflowConfig = function () {
return dialogflow_config;
};
И затем для программного управления контекстами:
/**
* @author Pruthvi Kumar
* @email pruthvikumar.123@gmail.com
* @create date 2018-08-15 04:37:15
* @modify date 2018-08-15 04:37:15
* @desc Operate on Dialogflow Contexts
*/
const dialogflow = require('dialogflow');
const dialogflowConfig = require('../modules/dialogflow_config');
const structjson = require('./dialogflow_structjson');
const util = require('util');
const contextsClient = new dialogflow.ContextsClient();
exports.setContextHistory = function (sessionId, intent_name, context_payload, preservedContext=false) {
/* maintain context stack per session */
/* context_payload = {input_contexts: [], output_contexts = []}
*/
const contextStack = dialogflowConfig.configStoreSingleton.init().contextStack;
if (intent_name) {
contextStack[sessionId].push({
intent: intent_name,
contexts: context_payload,
preserveContext: preservedContext
});
} else {
console.warn('[dialogflow_contexts]: Intent name is not provided OR Nothing in context_payload to add to history!');
}
};
exports.getContextHistory = function () {
const contextStack = dialogflowConfig.configStoreSingleton.init().contextStack;
return contextStack;
}
exports.preserveContext = function () {
const contextStack = dialogflowConfig.configStoreSingleton.init().contextStack;
//Traverse contextStack, get the last contexts.
let context_to_be_preserved = contextStack[dialogflowConfig.getDialogflowConfig()['sessionId']][contextStack[dialogflowConfig.getDialogflowConfig()['sessionId']].length - 1];
//console.log(`context to be preserved is: ${util.inspect(context_to_be_preserved)}`);
return context_to_be_preserved['contexts'].map((context, index) => {
let context_id = exports.getContextId(context);
return exports.updateContext(context_id, true)
});
}
Здесь вы можете ссылаться на этот ресурс github для создания своих собственных контекстов - https://github.com/googleapis/nodejs-dialogflow/blob/master/samples/resource.js
Счастливого создания цифровых душ!