Skip to content
Menu Academia

Disparando workflows a partir de um botão de chat, de ponta a ponta

Como funcionam os workflows api_trigger: encontrar os elegíveis, dispará-los a partir de um clique em botão ou da CLI, passar payloads e ler as variáveis trigger.* nos próprios passos do workflow.

deep-diveDesenvolvedorOps9 min read

Um botão de disparo de workflow parece simples — clica, o workflow roda — mas a regra de elegibilidade, o contrato do payload e o namespace de variáveis que o workflow lê são específicos o suficiente para que errar um detalhe (um workflow que não é api_trigger, um payload em array em vez de objeto) falhe de forma explícita em vez de silenciosa. Este é o contrato completo.

Elegibilidade: apenas workflows api_trigger

Um workflow do Dailybot tem um tipo de evento — agenda, envio de formulário, conclusão de check-in, ou api_trigger (“When triggered via API or button”). Apenas workflows api_trigger podem ser disparados de fora — via CLI, o endpoint REST, ou o callback_workflow de um botão de chat. Qualquer outro caso retorna 400 workflow_not_triggerable.

Workflows são criados e editados exclusivamente no aplicativo web do Dailybot — não há caminho de CLI para criar ou alterar um. Uma vez que um workflow api_trigger exista, resolva seu UUID:

dailybot workflow list --filter api_trigger --json

--filter api_trigger é uma conveniência do lado do cliente sobre o workflow list padrão — retorna apenas os workflows que você pode disparar legitimamente. Inspecione a configuração de um deles com:

dailybot workflow get <workflow_uuid> --json

Trate o JSON retornado como a fonte da verdade sobre o que o workflow realmente faz — não adivinhe pelo nome dele.

Disparando diretamente (CLI / API)

# Fire it, no payload
dailybot workflow trigger <workflow_uuid> --json

# Fire it with a JSON payload the workflow can read
dailybot workflow trigger <workflow_uuid> \
  --payload '{"version": "v2.5", "environment": "production"}' --json

Equivalente em HTTP:

curl -s -X POST \
  -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"payload": {"version": "v2.5"}}' \
  https://api.dailybot.com/v1/workflows/<workflow_uuid>/trigger/

Um disparo bem-sucedido retorna HTTP 202 — a execução fica enfileirada, não é síncrona, e a resposta não carrega nenhuma saída da execução; o workflow roda no servidor de forma assíncrona. --payload (ou o payload do corpo do request) precisa ser um objeto JSON — não um array, não um escalar — e é limitado a 8 KiB; qualquer coisa maior ou malformada retorna 400 workflow_trigger_payload_invalid. Um workflow congelado (desativado) retorna 403 workflow_frozen; um chamador sem permissão de execução recebe 403 workflow_execute_not_allowed; um UUID desconhecido retorna 404.

Confirme antes de disparar. workflow trigger tem efeitos colaterais — pode iniciar um deploy ou qualquer outra automação. Repita o workflow-alvo (nome + UUID) e o payload (ou “sem payload”) e aguarde um sim explícito antes de disparar a partir de um contexto de agente.

Disparando a partir de um botão de chat

O mesmo disparo do lado do servidor acontece quando o callback_workflow do botão de uma mensagem é clicado:

curl -sS -X POST 'https://api.dailybot.com/v1/send-message/' \
  -H 'X-API-KEY: $DAILYBOT_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "message": "Ready to redeploy staging?",
    "target_channels": ["C0123456789"],
    "buttons": [
      {"label": "Redeploy staging", "button_type": "interactive", "value": "redeploy_staging",
       "callback_workflow": "$REDEPLOY_WORKFLOW_UUID"}
    ]
  }'

Atalho de CLI:

dailybot chat send -c C0123456789 -m "Ready to redeploy staging?" \
  --workflow-button "Redeploy staging=$REDEPLOY_WORKFLOW_UUID"

callback_workflow aceita apenas o UUID do workflow — nomes e slugs são rejeitados. UUIDs desconhecidos, inativos ou de outra organização retornam 400 button_callback_workflow_not_found. Nenhuma chamada HTTP externa acontece e nenhum segredo de assinatura está envolvido: o disparo é inteiramente interno ao Dailybot, atribuído ao usuário que clicou.

Disparado por botão vs. disparado por API — mesmo mecanismo, uma variável os diferencia

Ambos os caminhos passam pelo mecanismo de disparo idêntico do lado do servidor. A única diferença visível para os próprios passos do workflow é {{trigger.source}}, que resolve para "api", "button_click" ou "modal_submit" — assim, um workflow pode ramificar seu comportamento (por exemplo, pular um passo de confirmação quando disparado por um clique de botão já confirmado, mas perguntar novamente quando disparado diretamente via API).

Lendo o contexto do clique dentro do workflow

Os passos do workflow disparado referenciam o contexto do disparo através do namespace {{trigger.*}}:

Variável Valor
{{trigger.source}} "api" | "button_click" | "modal_submit"
{{trigger.button_value}} O value do botão clicado
{{trigger.button_id}} O $btn/<uuid4> gerado pelo servidor
{{trigger.fields.<name>}} O valor enviado de um input do modal_body, se o botão abriu um modal antes
{{trigger.clicked_at}} Timestamp do clique
{{trigger.body.*}} O objeto bruto de --payload, quando disparado diretamente via API/CLI
{{trigger.user.*}} uuid, full_name, first_name, email, role do usuário que clicou/disparou
{{trigger.triggered_by_user_uuid}} Atalho para o UUID do usuário que disparou

Um workflow, vários botões

Em vez de criar workflows quase duplicados para variar um rótulo, aponte vários botões para o mesmo UUID de callback_workflow com values diferentes, e ramifique dentro do workflow com base em {{trigger.button_value}}:

{"message": "Choose a rollback target",
 "target_channels": ["C0123456789"],
 "buttons": [
   {"label": "Rollback to v2.3", "button_type": "interactive", "value": "v2.3", "callback_workflow": "$ROLLBACK_WORKFLOW_UUID"},
   {"label": "Rollback to v2.2", "button_type": "interactive", "value": "v2.2", "callback_workflow": "$ROLLBACK_WORKFLOW_UUID"}
 ]}

modal_body se combina com callback_workflow — o clique abre o modal, e no envio os valores dos campos são entregues como {{trigger.fields.<input.name>}}, sem nenhum servidor externo envolvido:

{"label": "Report", "button_type": "interactive", "value": "report",
 "callback_workflow": "$INCIDENT_WORKFLOW_UUID",
 "modal_body": {
   "title": "New incident",
   "blocks": [
     {"type": "input", "name": "summary", "label": "What happened?", "multiline": true, "required": true}
   ]
 }}

O workflow pode usar {{trigger.fields.summary}} em qualquer passo — pré-preencher a resposta de um formulário, compor uma mensagem de acompanhamento, ou alimentar um prompt de IA.

Referência de erros

Erro Quando
400 workflow_not_triggerable O tipo de evento do workflow não é api_trigger
400 workflow_trigger_payload_invalid O payload não é um objeto JSON, ou excede 8 KiB
400 button_callback_workflow_not_found callback_workflow não resolve a um workflow ativo na organização do chamador
403 workflow_execute_not_allowed O chamador não tem permissão para executar workflows
403 workflow_frozen O workflow está desativado
403 plan_upgrade_required Workflows não estão no plano da organização
404 UUID de workflow desconhecido

Referências cruzadas

Navegue pelo hub de Soluções para o passeio voltado ao produto sobre disparar automações direto do chat.

FAQ

Quais workflows podem ser disparados a partir de um botão de chat ou da API?
Somente workflows cujo tipo de evento é api_trigger ("When triggered via API or button"). Workflows com outros tipos de evento — agenda, envio de formulário, etc. — retornam workflow_not_triggerable se você tentar dispará-los via API, o comando de CLI workflow trigger, ou o callback_workflow de um botão.
Como encontro quais workflows são elegíveis para disparar a partir de um botão?
Execute dailybot workflow list --filter api_trigger --json. Este é um filtro de conveniência do lado do cliente sobre o endpoint de listagem padrão, que retorna apenas os workflows com tipo de evento api_trigger.
Como passo dados para um workflow disparado?
Passe um payload em formato de objeto JSON — via --payload em dailybot workflow trigger, ou o campo payload do corpo do request em POST /v1/workflows/<uuid>/trigger/. Precisa ser um objeto JSON (não um array ou escalar), limitado a 8 KiB, e os passos do workflow podem referenciá-lo como {{trigger.body.<key>}}.
Qual é a diferença entre disparar um workflow via API e via clique em botão?
Ambos usam exatamente o mesmo mecanismo de disparo do lado do servidor e ambos retornam o workflow para execução assíncrona. A diferença está apenas em {{trigger.source}}, que informa "api", "button_click" ou "modal_submit" para que os passos de um workflow possam ramificar de acordo com a forma como foram invocados.
Um workflow pode ser disparado por vários botões diferentes com significados diferentes?
Sim — aponte vários botões para o mesmo UUID de callback_workflow com strings de value diferentes, e ramifique dentro dos passos do workflow com base em {{trigger.button_value}}. Isso evita criar workflows quase duplicados só para variar o rótulo do botão.