2017-07-18 5 views
1

私は自分のactions.jsonに追加することで、自分のGoogleホームアプリケーションに深くリンクできることを知っています。Googleのアクションでフォローアップアクションを作成できますか?

私も、私は現在、そのようにやっているデフォルトで提供されますapp.StandardIntents.TEXT意図から、生の文字列値を解析することができることを知っている:

if(app.getRawInput() === 'make payment') { 
    app.ask('Enter payment information: '); 
} 
else if(app.getRawInput() === 'quit') { 
    app.tell('Goodbye!'); 
} 

しかし、Googleのアクションがフォロー作成するための直接的なサポートを提供しません場合によっては特定のユーザーの音声入力後に、

会話の流れの一例は以下のとおりです。

OK Googleは、私のアプリに話します。

私のアプリへようこそ、私はあなたの最近の購入または保存されたお気に入りを発注することができます。あなたはどちらを好きですか?

最近の購入。

ご希望の住所とお支払い方法を使用しますか?

はい。

[OK]を発注しました。

答えて

0

あなたは何をしようとしている会話フローの例を挙げることができますか?

API.AIを使用できる場合は、Follow Up intents in the docsです。

+0

私は元の質問を編集しました。 –

0

私はあなたのコード

if(app.getRawInput() === 'make payment') { 
    app.ask('Enter payment information: '); 
} 
else if(app.getRawInput() === 'quit') { 
    app.tell('Goodbye!'); 
} 

は良いアイデアだとは思いません。私はあなたが "支払い情報"と "終了"を扱う2つの異なる意思を持っていることをお勧めします。

+0

私はあなたに同意しますが、フォローアップインテント(チェーン化可能なインテント)を作成する方法はありますか?これまでは、すべてのエントリーポイントをアプリケーションに分割して別々のインテントを作成する方法しか知りませんでした。 –

1

私の以前の回答は、テスト後には機能しません。 テスト済みのバージョンです。

exports.conversationComponent = functions.https.onRequest((req, res) => { 
 
    const app = new ApiAiApp({request: req, response: res}); 
 
    console.log('Request headers: ' + JSON.stringify(req.headers)); 
 
    console.log('Request body: ' + JSON.stringify(req.body)); 
 
    
 
    const registerCallback = (app, funcName)=>{ 
 
    if (!app.callbackMap.get(funcName)){ 
 
     console.error(`Function ${funcName} required to be in app.callbackMap before calling registerCallback`); 
 
     return; 
 
    } 
 
    app.setContext("callback_followup", 1, {funcName}); 
 
    } 
 

 
    const deRegisterCallback = (app)=>{ 
 
    const context = app.getContext("callback_followup"); 
 
    const funcName = app.getContextArgument("callback_followup", "funcName").value; 
 
    const func = app.callbackMap.get(funcName); 
 
    app.setContext("callback_followup", 0); 
 
    return func; 
 
    } 
 

 
    app.callbackMap = new Map(); 
 
    app.callbackMap.set('endSurvey', (app)=>{ 
 
    if (app.getUserConfirmation()) { 
 
     app.tell('Stopped, bye!'); 
 
    } 
 
    else { 
 
     app.tell('Lets continue.'); 
 
    } 
 
    }); 
 

 
    app.callbackMap.set('confirmationStartSurvey', (app)=>{ 
 
    const context = app.getContext("callback_follwup"); 
 
    if (app.getUserConfirmation()) { 
 
     registerCallback(app, 'endSurvey'); 
 
     app.askForConfirmation('Great! I\'m glad you want to do it!, do you want to stop?'); 
 
    } else { 
 
     app.tell('That\'s okay. Let\'s not do it now.'); 
 
    } 
 
    }); 
 

 
    
 

 

 

 
    // Welcome 
 
    function welcome (app) { 
 
    registerCallback(app, 'confirmationStartSurvey'); 
 
    const prompt = "You have one survey in your task list, do you want to proceed now?"; 
 
    app.askForConfirmation(prompt); 
 
    
 
    } 
 
    
 
    function confirmationCalbackFollowup (app) { 
 
    const context = app.getContext("callback_followup"); 
 
    if (! context){ 
 
     console.error("ERROR: confirmationCallbackFollowup should always has context named callback_followup. "); 
 
     return; 
 
    } 
 
    const callback = deRegisterCallback(app); 
 
    return callback(app); 
 
    } 
 
    
 
    const actionMap = new Map(); 
 
    actionMap.set(WELCOME, welcome); 
 
    actionMap.set('confirmation.callback.followup', confirmationCalbackFollowup); 
 
    app.handleRequest(actionMap); 
 
});

アプリは、アクション関数が呼び出されるたびに生成されるので、以前のソリューションが動作しません。私はapp.dataにコールバック関数を保存しようとしましたが、既存の次のインテントは存在しません。だから私は別の方法を変えました。関数内のapp.callbackMapにコールバック関数を登録します。それはとにかくそこにいます。

重要なのは、Apiです。意図でコンテキストを定義する必要があります。 See the Api.Ai Intent here.

もちろん、イベント、コンテキスト、およびアクションがあることを確認してください。そうしないと、このインテントはトリガーされません。

このソリューションを使用できるかどうかお知らせください。私の以前の間違った解決に申し訳ありません。

ありがとうございました

関連する問題