node.js - Dialogflow 通过 NodeJS 传递参数

标签 node.js dialogflow-es

如何通过 NodeJS 请求传递参数?例如,我想传递我的代码中的名称,dialogflow 会自动回答包含我传递的参数的响应,如“Hi $name”。

我的实际请求:

const request = {
  session: sessionPath,
  queryInput: {
    text: {
      text: query,
      languageCode: languageCode,
    },
  },
};

编辑 4 [index.js],这是答案后新的正确代码

const projectId    = 'your-project-id';
const sessionId    = 'session-id';

const query        = 'your-query';
const languageCode = 'your-language';

const j = require("./structjson.js");   //download It from the answer 


const dialogflow    = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient({keyFilename: './THIS-IS-RIGHT.json'});

// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);


async function request() {
    const contextClient = new dialogflow.ContextsClient({ keyFilename: './your-path-to-file.json' });

    const contextData = {
        name: contextClient.contextPath(projectId, sessionId, 'your-context'),
        parameters: j.jsonToStructProto({ name: 'John' }),
        lifespanCount: 1
    };//An example for the name

    const context = await contextClient.createContext({
        parent: sessionPath,
        context: contextData
    });

    const request = {
        session: sessionPath,
        queryInput: {
            text: {
                text: query,
                languageCode
            }
        },
        queryParams: {
            contexts: context // You may want to add the other contexts here
        }
    };

    const result = await sessionClient.detectIntent(request);
    console.log(result);
}

request();

最佳答案

您可以在发送 event 而不是 text 时传递参数。

您需要将 javascript 对象转换为原型(prototype)结构。有包裹pb-util将处理编码/解码

const { struct } = require('pb-util');  

const request = {
    session: sessionPath,
    queryInput: {
        event: {
            name: eventName,
            parameters: struct.encode({ name: 'John' }),
            languageCode
        }
    }
};

之后,您将需要根据您的意图使用以下语法创建一个参数。 #eventName.name

enter image description here


另一种方法是创建上下文,使用 dialogflow.ContextsClient & client.createContext() 并将参数添加到上下文,然后发送queryInput 请求的上下文。

async function request() {
    const contextClient = new dialogflow.ContextsClient({ keyFilename: '..' });
    const sessionClient = new dialogflow.SessionsClient({ keyFilename: '..' });

    const contextData = {
        name: contextClient.contextPath('[PROJECT]', '[SESSION]', '[YOUR-CONTEXT]'),
        parameters: struct.encode({ name: 'John' }),
        lifespanCount: 1
    };

    const context = await contextClient.createContext({ 
        parent: sessionPath, 
        context: contextData 
    });

    const request = {
        session: sessionPath,
        queryInput: {
            text: {
                text: query,
                languageCode
            }
        },
        queryParams: {
            contexts: context // You may want to add the other contexts here
        }
    };

    const result = await sessionClient.detectIntent(request);
    console.log(result);
}

现在您需要创建一个参数,其值为:#your-context.name

关于node.js - Dialogflow 通过 NodeJS 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553140/

相关文章:

javascript - 更新 Mongoose 模型内的数组

node.js - 在 Heroku 上托管 Node.js 应用程序时键入错误

node.js - Mongodb 可尾游标 { 错误 : No More Documents in Tailed Cursor }

node.js - 当 ignore-scripts 设置为 true 时,npm 的行为有何不同?

dialogflow-es - 是否可以仅使用 DialogFlow 来解析文本?

node.js - Openshift 应用程序进入 "idle"且没有唤醒

node.js - 无服务器 AWS 上的 Google 凭证 json 文件

javascript - 如何通过 python sdk 或 javascript 将我的聊天机器人用户界面连接到 APIAI 服务器主机?

dialogflow-es - 是否可以在 Dialogflow 意图中查找数据库?

mysql - 为什么我的 Node.Js 代码在从用户那里获取值(value)时没有在第一个请求中给出响应?