【问题标题】:Dialogflow pass parameters through NodeJSDialogflow 通过 NodeJS 传递参数
【发布时间】:2018-11-06 06:23:42
【问题描述】:

如何通过 NodeJS 请求传递参数?例如,我想传递我的代码和对话框流中的名称,并自动回复包含我传递的参数的响应,如“Hi $name”。

我的实际请求:

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

EDIT 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();

【问题讨论】:

    标签: node.js dialogflow-es


    【解决方案1】:

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

    您需要将 javascript 对象转换为 proto 结构。有一个包pb-util 将处理编码/解码

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

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


    另一种方法是创建一个上下文,使用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

    【讨论】:

    • 你本质上不是两次创建上下文吗?首先使用 contextClient.createContext() 然后将它与检测意图的查询一起传递? (我有一种情况需要detectIntent()的输出来生成上下文参数)
    • 我在尝试使用您的代码时收到此错误:ERROR: TypeError: .google.cloud.dialogflow.v2beta1.QueryParameters.contexts: object expected
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 2022-01-25
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多