Dialogflow es 如何通过V2客户端库为node js创建OutPutContext

Dialogflow es 如何通过V2客户端库为node js创建OutPutContext,dialogflow-es,Dialogflow Es,我正在使用node.js的v2客户端库在代理中创建实体和意图。为此,我正在经历git上的这个过程。它说了一些与会话id和上下文id相关的东西。有人能解释一下什么是sessionId和contextId吗。并提供我的链接,我可以阅读这些东西的细节 我无法按照这些示例创建上下文。如何在创建意图的同时创建上下文。以下是创建上下文的代码。不能在单个API调用中创建上下文和意图,首先需要创建上下文,然后创建使用上下文的意图。对create context API调用的响应将返回一个可以在意图中使用的上下文

我正在使用node.js的v2客户端库在代理中创建实体和意图。为此,我正在经历git上的这个过程。它说了一些与会话id和上下文id相关的东西。有人能解释一下什么是sessionId和contextId吗。并提供我的链接,我可以阅读这些东西的细节


我无法按照这些示例创建上下文。如何在创建意图的同时创建上下文。

以下是创建上下文的代码。不能在单个API调用中创建上下文和意图,首先需要创建上下文,然后创建使用上下文的意图。对create context API调用的响应将返回一个可以在意图中使用的上下文ID

  const dialogflow = require('dialogflow');

  // Instantiates clients
  const entityTypesClient = new dialogflow.EntityTypesClient();

  // The path to the agent the created entity type belongs to.
  const agentPath = entityTypesClient.projectAgentPath(projectId);

  const createEntityTypeRequest = {
    parent: agentPath,
    entityType: {
      displayName: displayName,
      kind: kind,
    },
  };

  entityTypesClient
    .createEntityType(createEntityTypeRequest)
    .then(responses => {
      console.log(`Created ${responses[0].name} entity type`);
    })
    .catch(err => {
      console.error('Failed to create size entity type:', err);
    });

来源:

以下是创建上下文的代码。不能在单个API调用中创建上下文和意图,首先需要创建上下文,然后创建使用上下文的意图。对create context API调用的响应将返回一个可以在意图中使用的上下文ID

  const dialogflow = require('dialogflow');

  // Instantiates clients
  const entityTypesClient = new dialogflow.EntityTypesClient();

  // The path to the agent the created entity type belongs to.
  const agentPath = entityTypesClient.projectAgentPath(projectId);

  const createEntityTypeRequest = {
    parent: agentPath,
    entityType: {
      displayName: displayName,
      kind: kind,
    },
  };

  entityTypesClient
    .createEntityType(createEntityTypeRequest)
    .then(responses => {
      console.log(`Created ${responses[0].name} entity type`);
    })
    .catch(err => {
      console.error('Failed to create size entity type:', err);
    });

来源:

上下文与SessionID密切相关。比如说,你有一个聊天机器人,它在两台计算机上运行,为两个不同的用户提供服务。每个用户都有各自的会话id(如果您在节点中编码,当新用户启动聊天机器人时,您需要确保他/她将获得唯一的会话id)

现在,每个唯一的会话id都有唯一的上下文。从上面的示例中,假设用户1将初始化一个名为“abc”且寿命为2的输入上下文的意图,用户2将初始化另一个名为“xyz”且寿命为5的输入上下文的意图,根据每个用户的单独会话id记录这些各自的上下文。您可以通过编程控制(编辑)上下文及其生命周期。这是代码促进的Dialogflow相对于使用GUI的最大优势。使用像Firebase这样的服务,您还可以保留会话id及其关联的上下文,以便下次再次使用相同的用户登录时,它们可以从上次离开的位置开始

我可以分享我以前的一个项目中的一个片段,在这个项目中,我以编程方式管理上下文。初始化脚本如下所示:

/**
 * @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资源来构建自己的上下文-


快乐创造数字灵魂

上下文与SessionID密切相关。比如说,你有一个聊天机器人,它在两台计算机上运行,为两个不同的用户提供服务。每个用户都有各自的会话id(如果您在节点中编码,当新用户启动聊天机器人时,您需要确保他/她将获得唯一的会话id)

现在,每个唯一的会话id都有唯一的上下文。从上面的示例中,假设用户1将初始化一个名为“abc”且寿命为2的输入上下文的意图,用户2将初始化另一个名为“xyz”且寿命为5的输入上下文的意图,根据每个用户的单独会话id记录这些各自的上下文。您可以通过编程控制(编辑)上下文及其生命周期。这是代码促进的Dialogflow相对于使用GUI的最大优势。使用像Firebase这样的服务,您还可以保留会话id及其关联的上下文,以便下次再次使用相同的用户登录时,它们可以从上次离开的位置开始

我可以分享我以前的一个项目中的一个片段,在这个项目中,我以编程方式管理上下文。初始化脚本如下所示:

/**
 * @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资源来构建自己的上下文-


快乐创造数字灵魂

您当前用于创建意图的代码是什么?请提供准确的代码,我也能够提供上下文,需要查看您的代码以建议修改。要创建意图,您将仅调用链接中提供的createIntent()方法。无论如何,你可以看到它作为参考:它在python中,但是你可以很容易地将它转换成节点JS。你基本上需要添加一行。你目前用于创建意图的代码是什么?请提供准确的代码,我也能够提供上下文,需要查看您的代码以建议修改。要创建意图,您将仅调用链接中提供的createIntent()方法。无论如何,您可以看到这一点以供参考:它在python中,但您可以轻松地将其转换为节点JS。您基本上需要添加一行。您在回答中给出的上述代码是相关实体创建。我很困惑。这如何帮助我创建上下文。正如您所说,您不能在单个API调用中创建上下文和意图,您首先需要创建上下文,然后创建意图。我在文档中没有发现这样的东西。你能分享一些我可以详细阅读的链接吗?这些链接不是在文档中明确的,而是你如何通过API创建意图和上下文的事实。如果创建意图并希望将上下文附加到意图,则需要通过ID引用上下文。当由Dialogflow创建上下文时,将为上下文创建上下文ID,并且在创建上下文之前无法知道上下文ID。因此,由于意图需要上下文ID,并且在创建上下文之前不会生成上下文ID,因此必须在创建意图之前创建上下文。您能否将答案中的代码替换为与上下文相关的代码。您提供的代码是用于entity@FaisalAhmed在这里,您有一些上下文函数要插入到代码中:您在回答中给出的上述代码是相关实体创建。我很困惑。这将如何帮助我创建上下文。正如您所说的,您不能在单个API调用中创建上下文和意图,您首先需要