Amazon EchoのAlexaスキル開発で地味にはまったところをメモしておく

解決してしまえば大したことないが時間がもったいない系の色々

対話モデルの設定でサンプル発話のスロット前後にスペースがないとエラーになる問題

エラー

AddHomeShoppingIntent {Item}を追加

Error: There was a problem with your request: Parsing error in sample: AddHomeShoppingIntent {Item}を追加

以下はOK

AddHomeShoppingIntent {Item} を追加

パースエラーとしか言ってくれないし、ドキュメントのサンプルをみても特にスペースとか入ってない、のでこれをこのまま入れると怒られる。 スペース入れればおっけー。 エラーメッセージもアレだがドキュメントに書いて欲しい。

Echosim.ioで無限にsomething went Wrong. Oopsと言われる

フォーラムでのやりとりを見る限り、どうもEchosim.ioの不具合っぽい。 一応自分の環境はChromeだが特にブラウザどうこうという話でもなさそう。 再ログインして一時的に復活したりもするが一度エラーのループに入ると、「アレクサ、今日の天気を教えて」的なリクエストも全部上記のエラーとなってしまう。 このパターンはスキル側の不具合を疑っても時間の無駄なのでひとまず開発者コンソールからのリクエストで問題なければおっけーと考えた方がよさそう。 Amazon mShop appを使うと良いという回答がついているが、ようわからんので、このあたりは何かわかったら追記するやも。 amazon shoppingのアプリにalexaが搭載されており、英語で話しかける分にはテスト出来るが、こちらはamazon.comのみで英語はEngishとSpanishのみ。日本語はamazon.co.jpでしか使えず、amazon.co.jpでは音声での商品検索が出来るだけでalexaが起動するわけではないのでテストすることはやはり出来ない。

Alexa Skills Kit SDK for Node.jsでAlexa.handlerにいわゆるLambdaのcallbackを渡すとemitした段階でレスポンスを返してくれない

alexa-skills-kit-sdk-for-nodejs/response.js at master · alexa/alexa-skills-kit-sdk-for-nodejs · GitHub

このあたりの処理を見る限りcontext.succeedの形式もcallbackの形式も両対応してるようなんだけど、どうも何らかのイベントが実行され続けているらしく常にタイムアウトしてしまう。 f:id:egmc:20171128231855p:plain

AWS Solutions Architect ブログ: AWS LambdaでNode.js 4.3.2が利用可能になりました

[12/9追記]

単にメッセージを返すだけの処理でも発生するので、sdkの問題っぽい。 ローカル実行してプロファイラでおっかけたところwunderlistのsdkでした、alexa-sdkは無罪。

issueもあがってた Script Hangs · Issue #12 · wunderlist/wunderlist.js · GitHub

wunderlistsdkをnewした段階で何らかのイベントが動き続けていてタイムアウトまで実行し続けていた模様、対応は↓の通りで変わりなく、まあ必要な処理が終わった段階でのcallbackなのでcallbackWaitsForEmptyEventLoopは基本falseでもいいんじゃないかとは思う。

[/追記おわり]

回避策としてはcallbackを渡さない古いスタイルで書くか、↑の通りcontext.callbackWaitsForEmptyEventLoop = false;を指定しておけばOK。

レポジトリのサンプルではcallbackを渡しているが

https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs

ブログのチュートリアルでは渡してなかったりするのはこのあたりにはまる人が多いのやも?

Alexaスキル開発トレーニングシリーズ 第2回 対話モデルとAlexa SDK : Alexa Blogs