5 dicas para desenvolver suas próprias skills personalizadas

  • por

Na última semana, sofrendo da “Síndrome da Quarentena”, resolvi aprender como desenvolver Skills para a Alexa, mas pensando na utilização prática no meu dia-a-dia profissional.

No começo, devido ao material disponível, imaginei a complicação que seria, até achar um link que me “abriu a mente”: Como direcionar as requisições da Alexa para seu próprio servidor.

O processo é simples:

Primeiro, você cria o Skill da Alexa, com as palavras chaves (Intents);

Segundo, você configura seu skill para passar estes intents para o seu servidor https;

Terceiro, você codifica (na sua linguagem preferida) o que deve ser feito em cada situação.

Com isto em mente, vamos às dicas (no meu caso, estão em python usando Flask-Ask, uma biblioteca para interagir com os intents):

Dica 01: Use o NGROK para testar sua aplicação. o NGROK cria um tuneo entre a internet e seu localhost, facilitando os testes antes de subir para a produção:

Dica 02: Todo o trabalho “pesado” de tratamento da voz é feito pela AWS. Você somente se preocupa com as mensagens que devem ser apresentadas.

Dica 03: Os skills já possuem alguns intents próprios, como @stop, @cancel, @help. Você só precisa tratar em sua aplicação:

@ask.intent('AMAZON.StopIntent')
def stop():
    return statement("Até a próxima!")


@ask.intent('AMAZON.CancelIntent')
def cancel():
    return statement("Até a próxima!")

@ask.session_ended
def session_ended():
    return "{}", 200

Dica 04: Programe do seu jeito. Não se preocupe (ainda) com otimização do código.

Dica 05: Em respostas longas, use templates com jinja2. Veja o código abaixo (estou pedindo para a Alexa me dar um resumo dos serviços em todos os meus servidores Nagios:

@ask.intent("resumoIntent")
def get_resumo():
    should_end_session = False
    data_alexa = []
    ambientes = get_user_confs(context.System.user.userId)
    json_data = ambientes.to_json()
    servers = json.loads(json_data)
    for server in servers:
        WARNING = get_service_status(server['nag_url'], "warning", server['nag_user'], server['nag_pass'])
        CRITICAL = get_service_status(server['nag_url'], "critical", server['nag_user'], server['nag_pass'])
        UNKNOWN = get_service_status(server['nag_url'], "unknown", server['nag_user'], server['nag_pass'])
        PENDING = get_service_status(server['nag_url'], "pending", server['nag_user'], server['nag_pass'])
        TOTAL = WARNING + CRITICAL + UNKNOWN + PENDING
        reg_template = {"ambiente": server['ambiente'], "total": str(TOTAL), "warning": str(WARNING), "critical": str(CRITICAL), "unknown": str(UNKNOWN), "pending": str(PENDING)}
        data_alexa.append(reg_template)
    resumo_out = render_template('resumo', data=data_alexa)
    return question(resumo_out).reprompt(" ")

Perceba que eu possuo uma chamada para o render_template, passa as informações do resumo como data_alexa. O render_template vai passar as informações para o meu template em jinja2 (onde eu trato se é singular ou plural, entre outras coisas):

resumo: |
  {% for s in data %}
    {% set total = s['total']|int() %}
    {% set warning = s['warning']|int() %}
    {% set critical = s['critical']|int() %}
    {% set unknown = s['unknown']|int() %}
    {% set pending = s['pending']|int() %}

    {% if total > 1 %}
      {% set servico = "serviços" %}
      {% set alarme = "alarmes" %}
    {% else %}
      {% set servico = "serviço" %}
      {% set alarme = "alarme" %}
    {% endif %}

    {% if total == 0 %}
      No ambiente {{ s['ambiente'] }} não há {{ servico }} com {{ alarme }}.
    {% else %}
      No ambiente {{ s['ambiente'] }} há {{ s['total'] }} {{ servico }} com {{ alarme }}.
    {% endif %}

    {% if total > 1 %}
      {% set servico = "serviços" %}
      {% set alarme = "alarmes" %}
    {% else %}
      {% set servico = "serviço" %}
      {% set alarme = "alarme" %}
    {% endif %}

    {% if total > 0 %}
      Sendo:
    {% endif %}

    {% if warning > 1 %}
      {% set alerta = "warnings" %}
    {% else %}
      {% set alerta = "warning" %}
    {% endif %}

    {% if warning > 0 %}
      {{ warning }} {{ alerta }}.

    {% endif %}

    {% if critical > 1 %}
      {% set critico = "críticos" %}
    {% else %}
      {% set critico = "crítico" %}
    {% endif %}


    {% if critical > 0 %}
      {{ critical }} {{ critico }}.

    {% endif %}

    {% if unknown > 1 %}
      {% set desconhecido = "desconhecidos" %}
    {% else %}
      {% set desconhecido = "desconhecido" %}
    {% endif %}


    {% if unknown > 0 %}
      {{ unknown }} {{ desconhecido }}.

    {% endif %}

    {% if pending > 1 %}
      {% set pendente = "pendentes" %}
    {% else %}
      {% set pendente = "pendente" %}
    {% endif %}


    {% if pending > 0 %}
      {{ pending }} {{ pendente }}.

    {% endif %}
  {% endfor %}
  Mais alguma informação?
  

Por hoje é só, “velhinhos”…. Qualquer coisa, dúvida ou info, use o form de contato ou o whatsapp 🙂

Marcações:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *