Como melhorar seu código com os interceptores de resposta do Alexa

Garrett Vargas 27 dez

Eu publiquei mais de uma dúzia de habilidades no Alexa nos últimos anos. Eu me deparei com vários padrões e práticas recomendadas nesse período.

Um dos recursos mais poderosos, porém pouco divulgados, do SDK que usei extensivamente em meu código é o Response Interceptor. Faz parte do SDK do Alexa Node . Este SDK simplifica o desenvolvimento de habilidades do Alexa.

Ao usá-lo, você pode encontrar seu código ficando confuso com tarefas redundantes de manipulação de erros e limpeza. Os interceptores de resposta permitem inserir um gancho no fluxo de lidar com as intenções do Alexa. Isso mantém seu código limpo executando ações de última hora em um local central antes de passar a resposta de volta para o Alexa. Isso é extremamente útil para depuração , resolução de tarefas comuns e, geralmente, limpeza de respostas para evitar alguns erros comuns encontrados ao usar o ecossistema do Alexa.

Depuração

Para adicionar um interceptor de resposta com o Alexa SDK, você passa uma classe que implementa uma função de processo para a função addResponseInterceptors no seu objeto SkillBuilder, conforme mostrado no exemplo de código abaixo. Nós vamos chegar aos detalhes da implementação desta classe em um momento.

Configurando um ResponseInterceptor e um RequestInteceptor

Este trecho também mostra a configuração de uma função de interceptação de solicitação que será executada antes que uma solicitação seja passada para seus manipuladores de Alexa. Por exemplo, acho que ajuda a depuração para registrar cada solicitação de entrada e a resposta de saída. Você pode fazer isso com o interceptador de solicitação e o interceptor de resposta, conforme demonstrado neste snippet de código. O trecho também mostra a sintaxe da função de processo que retorna um Promise vazio.

Salvando pares de solicitação / resposta para depuração

Resolvendo Tarefas Comuns

Muitas das minhas habilidades processam AMAZON.RepeatIntent para que o usuário possa ouvir novamente a última resposta. Se você tem uma habilidade complexa, especialmente uma que mantém mecanismos de estado, você deve fornecer detalhes adicionais quando o usuário pedir a Alexa que se repita para que o usuário saiba exatamente onde eles estão. Mas em habilidades mais simples, é bom simplesmente repetir a resposta anterior de volta para o usuário. Um interceptor de resposta permite que você salve cada fala de saída e responda a sugestão para que você possa reproduzi-las facilmente:

Salvando a resposta e o aviso para usar em Repetir

Outra tarefa comum é manipular atributos. O Alexa SDK tem várias camadas de atributos.

  • solicitar atributos (somente bons durante uma única solicitação)
  • atributos da sessão (bons para a duração de uma sessão)
  • atributos persistentes (salvos em uma loja como o DynamoDB para serem usados nas sessões).

Acho que fazer malabarismos com tudo isso pode ser esmagador. Estruturei meu código para usar somente atributos de sessão, que salvei no armazenamento persistente no final da sessão. Mas há dois problemas com isso como uma abordagem geral – há atributos que talvez você não queira salvar e há momentos em que você deseja que um valor passe entre os manipuladores, mas não durante a sessão (o que os atributos da solicitação pretendem resolver).

Eu consigo contornar esses problemas usando uma sessão e solicito um objeto fora dos meus atributos. Você pode ver um exemplo do campo de sessão no snippet de código acima, salvando lastResponse e lastReprompt. Não quero salvá-los persistentemente, portanto, limpo todo esse objeto antes de persistir no armazenamento no final da sessão. De maneira semelhante, eu limpo o objeto de solicitação toda vez no final do meu interceptor de resposta, de modo que esses atributos realmente permanecem apenas para solicitação.

Salvando atributos persistentes no final da sessão e limpando atributos somente de solicitação

Evitando Erros Comuns

Uma das limitações que afetam muitos desenvolvedores é que as respostas não podem conter mais de 5 tags de áudio. Às vezes pode ser difícil evitar isso com conteúdo dinâmico.

Por exemplo, na minha habilidade de Blackjack, eu toco um som para cada carta que é distribuída. Normalmente não é um problema. Mas ao ler a mão do dealer, se eles acabarem comprando várias cartas, você pode ultrapassar esse limite. Claro, eu poderia tentar pegar isso quando estou gerando a resposta, mas isso convolui o código. Quem vai dizer se ele atinge todos os casos?

É muito melhor remover o excesso de efeitos sonoros como parte do manipulador de respostas. Para essa habilidade, basta remover o excesso de arquivos de áudio do final da resposta para reduzir a contagem para 5.

Removendo arquivos de áudio extras da resposta

Outro problema que eu encontrei é que você não tem permissão para retornar diretivas junto com a diretiva Dialog.Delegate se você estiver obtendo slots do usuário. Isso pode ser irritante se você estiver manipulando a entrada de botão ou usando diretivas de exibição. Talvez seja necessário fazer check-in em vários locais antes de adicionar diretivas à sua resposta para garantir que você não entre em conflito com o Dialog.Delegate. Mantenha seu código limpo e use um responseInterceptor para filtrar suas diretivas antes de retornar:

Assegurando que nenhuma diretiva seja enviada junto com o Dialog.Directive

Espero que você tenha gostado dessas dicas e veja o poder de usar interceptadores de resposta. Deixe-me saber suas próprias práticas recomendadas e compartilhar suas próprias dicas na seção de comentários!

Texto original en inglés.