Como usar Flows com a Google Vision API e Google Cloud Functions
Pássaro
6 de out. de 2020
Construtor de Fluxo
1 min read

Principais Conclusões
Flows é mais do que uma ferramenta sem código — é um mecanismo de automação flexível que permite estender fluxos de trabalho com código usando serviços externos como Google Cloud Functions ou AWS Lambda.
Este tutorial demonstra como construir um chatbot do Telegram que utiliza Google Vision API para identificar imagens (como detectar se uma foto contém um cachorro-quente 🥪).
O exemplo mostra como Flows pode facilmente se conectar a APIs de reconhecimento de imagem para processar automaticamente o conteúdo enviado pelo usuário.
Desenvolvedores podem aproveitar essa arquitetura para construir automação do mundo real, como verificação de entregas, verificação de identidade ou fluxos de trabalho de controle de qualidade.
Integrar o Google Vision API dentro de uma Cloud Function possibilita insights potencializados por IA (detecção de objetos, confiança na etiqueta, extração de metadados) que o Flows pode usar dinamicamente.
O passo “Buscar Variáveis” no Flow Builder é a ponte — ele chama a função em nuvem e armazena a resposta da API para uso posterior na conversa.
Blocos de resposta podem usar variáveis como {{isHotDog}} para personalizar respostas, transformando dados brutos em mensagens de chat contextuais.
Enquanto a demonstração é lúdica, ela demonstra como os desenvolvedores podem misturar lógica sem código com funções serverless para desbloquear poderosas capacidades de automação em canais de mensagens.
Destaques de Perguntas e Respostas
O que é o Flow Builder?
O Flow Builder (ou Flows) é a engine de automação visual da Bird para criar fluxos de comunicação entre canais — sem a necessidade de código, embora possa ser estendido com código personalizado.
Por que usar o Google Cloud Functions com Flows?
As Cloud Functions permitem que você execute código sem servidor para processar dados (como analisar imagens ou buscar dados de APIs externas) e alimentar os resultados de volta em seu fluxo.
O que a API do Google Vision faz nessa configuração?
Ele realiza análise de imagem — identificando objetos, rótulos ou conceitos (como “hot dog”) — e retorna dados estruturados para o seu Fluxo.
Como conecto uma Função em Nuvem ao Flow Builder?
Use a etapa Buscar Variáveis para chamar o endpoint HTTPS público da função. A resposta (por exemplo,
{ "isHotDog": true }) pode ser usada em etapas posteriores.Isso pode ser usado para casos reais de negócios?
Absolutamente. A mesma abordagem pode validar fotos de entrega, detectar itens danificados, reconhecer documentos ou verificar mídias enviadas.
O que torna esta integração poderosa?
Ele combina visão de IA, flexibilidade sem servidor e comunicação multicanal, permitindo automações mais inteligentes sem a necessidade de manutenção de infraestrutura.
Preciso de experiência em programação para acompanhar?
Uma familiaridade básica com JavaScript (para a Função do Google Cloud) ajuda, mas a maior parte do processo — desde a conexão de canais até a lógica de fluxo — é visual e amigável para iniciantes.
Flows é um poderoso motor de automação arrastar-e-soltar para criar fluxos de comunicação. Inicialmente o concebemos como uma solução sem código, mas descobrimos que muitos usuários conseguiam comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Esses pedaços de código podem estar dentro do Flow Builder, ou podem ser funções em nuvem de terceiros, como funções AWS Lambda ou Google Cloud Functions.
Esta é uma demonstração simples usando GoogleCloud Functions e Flows para fazer reconhecimento de imagem em uma imagem enviada pelo Telegram.
Flows é um poderoso motor de automação arrastar-e-soltar para criar fluxos de comunicação. Inicialmente o concebemos como uma solução sem código, mas descobrimos que muitos usuários conseguiam comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Esses pedaços de código podem estar dentro do Flow Builder, ou podem ser funções em nuvem de terceiros, como funções AWS Lambda ou Google Cloud Functions.
Esta é uma demonstração simples usando GoogleCloud Functions e Flows para fazer reconhecimento de imagem em uma imagem enviada pelo Telegram.
Flows é um poderoso motor de automação arrastar-e-soltar para criar fluxos de comunicação. Inicialmente o concebemos como uma solução sem código, mas descobrimos que muitos usuários conseguiam comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Esses pedaços de código podem estar dentro do Flow Builder, ou podem ser funções em nuvem de terceiros, como funções AWS Lambda ou Google Cloud Functions.
Esta é uma demonstração simples usando GoogleCloud Functions e Flows para fazer reconhecimento de imagem em uma imagem enviada pelo Telegram.
Fluxos e Além
Como desenvolvedor de Flows, muitas vezes penso em quem são nossos usuários, por que eles usam Flows e o que precisam para alcançar seus objetivos; e então, quais recursos precisamos implementar para melhor atender a esses usuários.
Flows é um poderoso motor de automação de arrastar e soltar para criar fluxos de comunicação. Nós o concebemos inicialmente como uma solução sem código, mas descobrimos que muitos usuários poderiam obter comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Por exemplo, você pode criar fluxos que automaticamente geram leads e casos no Salesforce com base em interações dos clientes em vários canais. Esses trechos de código podem estar dentro do Flows, ou podem ser funções de nuvem de terceiros, como funções do AWS Lambda ou funções do Google Cloud.
Um caso de uso interessante: Reconhecimento de Imagem
Para um exemplo curto e engraçado, eu vou mostrar como implementar um aplicativo que reconhece cachorro-quente. Nós vamos configurar um fluxo no Flows, que receberá imagens dos usuários e decidirá se eles enviaram um cachorro-quente ou não.
Para muitos dos nossos clientes, esse tipo de reconhecimento de imagem pode ser muito poderoso. Imagine que você administre um serviço de entrega e quisesse verificar entregas bem-sucedidas automaticamente. Semelhante ao que vou mostrar, você poderia usar dados de localização, fotos de pacotes e até mesmo assinaturas dos destinatários para criar um fluxo de verificação no Flows.
Como desenvolvedor de Flows, muitas vezes penso em quem são nossos usuários, por que eles usam Flows e o que precisam para alcançar seus objetivos; e então, quais recursos precisamos implementar para melhor atender a esses usuários.
Flows é um poderoso motor de automação de arrastar e soltar para criar fluxos de comunicação. Nós o concebemos inicialmente como uma solução sem código, mas descobrimos que muitos usuários poderiam obter comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Por exemplo, você pode criar fluxos que automaticamente geram leads e casos no Salesforce com base em interações dos clientes em vários canais. Esses trechos de código podem estar dentro do Flows, ou podem ser funções de nuvem de terceiros, como funções do AWS Lambda ou funções do Google Cloud.
Um caso de uso interessante: Reconhecimento de Imagem
Para um exemplo curto e engraçado, eu vou mostrar como implementar um aplicativo que reconhece cachorro-quente. Nós vamos configurar um fluxo no Flows, que receberá imagens dos usuários e decidirá se eles enviaram um cachorro-quente ou não.
Para muitos dos nossos clientes, esse tipo de reconhecimento de imagem pode ser muito poderoso. Imagine que você administre um serviço de entrega e quisesse verificar entregas bem-sucedidas automaticamente. Semelhante ao que vou mostrar, você poderia usar dados de localização, fotos de pacotes e até mesmo assinaturas dos destinatários para criar um fluxo de verificação no Flows.
Como desenvolvedor de Flows, muitas vezes penso em quem são nossos usuários, por que eles usam Flows e o que precisam para alcançar seus objetivos; e então, quais recursos precisamos implementar para melhor atender a esses usuários.
Flows é um poderoso motor de automação de arrastar e soltar para criar fluxos de comunicação. Nós o concebemos inicialmente como uma solução sem código, mas descobrimos que muitos usuários poderiam obter comportamentos realmente poderosos escrevendo algum código para casos de uso específicos. Por exemplo, você pode criar fluxos que automaticamente geram leads e casos no Salesforce com base em interações dos clientes em vários canais. Esses trechos de código podem estar dentro do Flows, ou podem ser funções de nuvem de terceiros, como funções do AWS Lambda ou funções do Google Cloud.
Um caso de uso interessante: Reconhecimento de Imagem
Para um exemplo curto e engraçado, eu vou mostrar como implementar um aplicativo que reconhece cachorro-quente. Nós vamos configurar um fluxo no Flows, que receberá imagens dos usuários e decidirá se eles enviaram um cachorro-quente ou não.
Para muitos dos nossos clientes, esse tipo de reconhecimento de imagem pode ser muito poderoso. Imagine que você administre um serviço de entrega e quisesse verificar entregas bem-sucedidas automaticamente. Semelhante ao que vou mostrar, você poderia usar dados de localização, fotos de pacotes e até mesmo assinaturas dos destinatários para criar um fluxo de verificação no Flows.
Um plano para o sucesso
Primeiro, configuraremos uma função em nuvem, que recebe uma solicitação com uma URL para uma imagem, então ela usa uma API de reconhecimento de imagem para processar a imagem, e responde se há um cachorro-quente na imagem ou não.
Depois, construiremos um fluxo, que recebe uma mensagem de um usuário através de um canal de mensagens (Telegram, neste caso), executa a função em nuvem acima e responde ao usuário se há um cachorro-quente na imagem que ele enviou.
Primeiro, configuraremos uma função em nuvem, que recebe uma solicitação com uma URL para uma imagem, então ela usa uma API de reconhecimento de imagem para processar a imagem, e responde se há um cachorro-quente na imagem ou não.
Depois, construiremos um fluxo, que recebe uma mensagem de um usuário através de um canal de mensagens (Telegram, neste caso), executa a função em nuvem acima e responde ao usuário se há um cachorro-quente na imagem que ele enviou.
Primeiro, configuraremos uma função em nuvem, que recebe uma solicitação com uma URL para uma imagem, então ela usa uma API de reconhecimento de imagem para processar a imagem, e responde se há um cachorro-quente na imagem ou não.
Depois, construiremos um fluxo, que recebe uma mensagem de um usuário através de um canal de mensagens (Telegram, neste caso), executa a função em nuvem acima e responde ao usuário se há um cachorro-quente na imagem que ele enviou.
Configurando a Google Cloud Function
Primeiro, precisaremos configurar uma função em nuvem. Para começar rapidamente, siga o tutorial de início rápido das Funções em Nuvem do Google. Como ‘Disparador’, escolha o disparador HTTP, ambiente de execução: Node.js 10, e no campo de código fonte insira o trecho de código. É um código simples, que verifica se o pedido contém código JSON e responde sim ou não.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (req, res) => { let message = req.query.url ? "yes" : "no"; res.setHeader('Content-Type', 'application/json'); res.status(200).send(JSON.stringify({ isHotDog: message })); };

Em seguida, você precisará implantar esta função. Para testá-la dentro da Google Cloud Platform, siga os passos do tutorial.
Para testar a partir do seu navegador, vá para a seguinte URL inserindo o endereço específico da sua função:
https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot/?url=hello deve retornar {“isHotDog”: true} e o endereço https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot deve retornar {“isHotDog”: false}.
Bom trabalho! Você configurou uma função em nuvem do Google. Agora precisamos tornar nossa função em nuvem mais inteligente.
Primeiro, precisaremos configurar uma função em nuvem. Para começar rapidamente, siga o tutorial de início rápido das Funções em Nuvem do Google. Como ‘Disparador’, escolha o disparador HTTP, ambiente de execução: Node.js 10, e no campo de código fonte insira o trecho de código. É um código simples, que verifica se o pedido contém código JSON e responde sim ou não.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (req, res) => { let message = req.query.url ? "yes" : "no"; res.setHeader('Content-Type', 'application/json'); res.status(200).send(JSON.stringify({ isHotDog: message })); };

Em seguida, você precisará implantar esta função. Para testá-la dentro da Google Cloud Platform, siga os passos do tutorial.
Para testar a partir do seu navegador, vá para a seguinte URL inserindo o endereço específico da sua função:
https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot/?url=hello deve retornar {“isHotDog”: true} e o endereço https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot deve retornar {“isHotDog”: false}.
Bom trabalho! Você configurou uma função em nuvem do Google. Agora precisamos tornar nossa função em nuvem mais inteligente.
Primeiro, precisaremos configurar uma função em nuvem. Para começar rapidamente, siga o tutorial de início rápido das Funções em Nuvem do Google. Como ‘Disparador’, escolha o disparador HTTP, ambiente de execução: Node.js 10, e no campo de código fonte insira o trecho de código. É um código simples, que verifica se o pedido contém código JSON e responde sim ou não.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (req, res) => { let message = req.query.url ? "yes" : "no"; res.setHeader('Content-Type', 'application/json'); res.status(200).send(JSON.stringify({ isHotDog: message })); };

Em seguida, você precisará implantar esta função. Para testá-la dentro da Google Cloud Platform, siga os passos do tutorial.
Para testar a partir do seu navegador, vá para a seguinte URL inserindo o endereço específico da sua função:
https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot/?url=hello deve retornar {“isHotDog”: true} e o endereço https://seu-endereço-da-função.cloudfunctions.net/HotDogOrNot deve retornar {“isHotDog”: false}.
Bom trabalho! Você configurou uma função em nuvem do Google. Agora precisamos tornar nossa função em nuvem mais inteligente.
Configurando a API do Google Vision
Para torná-lo mais inteligente, vamos adicionar reconhecimento de imagem. Para este propósito, usaremos a API do Google Vision. Para começar, siga os passos 1-4 no guia de início rápido da API Vision. No tutorial, você ativará a API Vision e criará uma conta de serviço para usá-la.
Agora volte para a função em nuvem que você criou. Ative "Variáveis de ambiente, rede, tempos limite e mais" e no arquivo "Conta de serviço" escolha a conta de serviço VisionAPI que você acabou de criar. Agora podemos acessar a API Vision dentro da nossa função.

Agora vamos mudar o código. Na aba "Package.json", insira este código. Ele adicionará a biblioteca da API do Google Vision como uma dependência para sua função.
{ "name": "sample-http", "version": "0.0.1", "dependencies": { "@google-cloud/vision": "^1.11.0" } }
na aba "Index.js", atualize o código existente com o seguinte trecho de código.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (request, response) => { var url = request.query.url || request.body.url; if (url == null || url == "" ) { response.status(400).json({ error: "Must include a 'url' query parameter." }); } getImageLabels(url) .then(labels => { // You can use 'console.log(labels);' command to check labels you got // We filter all labels if they contain "hot dog" in label description // And have a score > 0.6, which mean that VisionAPI is at least 60% sure that there is a hotdog on a picture labels = labels.filter(function(label) { return label.description.toLowerCase().includes("hot dog") && label.score > 0.6; }); // If labels array contains at least 1 element, then we found a hot-dog! if (labels.length > 0) { response.status(200).json({isHotDog: true, error: ""}); } else { response.status(200).json({isHotDog: false, error: ""}); } }) .catch(err => { response.status(500).json({ error: err }); }); }; async function getImageLabels(imageUrl) { // Imports the Google Cloud client library const vision = require('@google-cloud/vision'); // Creates a client const client = new vision.ImageAnnotatorClient(); // Performs label detection on the image file const [result] = await client.labelDetection(imageUrl); const labels = result.labelAnnotations; return labels }

Qual é a diferença em comparação com a versão anterior? Adicionamos uma solicitação à VisionAPI, que retorna os ‘rótulos’ encontrados na imagem. Depois filtramos esses rótulos pela descrição: se contiver “hot dog” e se tiver mais de 60% de confiança nesse rótulo. Se houver pelo menos 1 rótulo restante após a filtragem, isso significa que encontramos um hotdog na imagem.
Recursos da API Vision | O que isso habilita em Fluxos |
|---|---|
Rótulos de objeto (por exemplo, “hot dog”) | Identificar objetos e automatizar ações com base na detecção |
Scores de confiança | Controlar precisão (por exemplo, > 60% de confiança aciona fluxo de trabalho) |
Extração de metadados | Incluir contexto como números, objetos e ambiente |
Biblioteca expansível | Adicionar mais detecções com poder de IA além de hot dogs |
Para entender como a API do Google Vision funciona e visualizar respostas de exemplo, verifique a documentação oficial da API Vision.
Depois disso, implante a nova versão da nossa função. Para testá-la a partir do seu navegador, encontre qualquer imagem de um hotdog e salve seu URL. Agora vá para o URL da sua função (inserindo o endereço correto para sua função) https://seu-endereco-da-funcao.cloudfunctions.net/HotDogOrNot?url=url_da_imagem e substitua o “url_da_imagem” pelo URL da imagem encontrada. Se houver um hotdog na imagem, a página retornará {“isHotDog”: true}.
Agora vamos conectar essa função ao Flow Builder.
Para torná-lo mais inteligente, vamos adicionar reconhecimento de imagem. Para este propósito, usaremos a API do Google Vision. Para começar, siga os passos 1-4 no guia de início rápido da API Vision. No tutorial, você ativará a API Vision e criará uma conta de serviço para usá-la.
Agora volte para a função em nuvem que você criou. Ative "Variáveis de ambiente, rede, tempos limite e mais" e no arquivo "Conta de serviço" escolha a conta de serviço VisionAPI que você acabou de criar. Agora podemos acessar a API Vision dentro da nossa função.

Agora vamos mudar o código. Na aba "Package.json", insira este código. Ele adicionará a biblioteca da API do Google Vision como uma dependência para sua função.
{ "name": "sample-http", "version": "0.0.1", "dependencies": { "@google-cloud/vision": "^1.11.0" } }
na aba "Index.js", atualize o código existente com o seguinte trecho de código.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (request, response) => { var url = request.query.url || request.body.url; if (url == null || url == "" ) { response.status(400).json({ error: "Must include a 'url' query parameter." }); } getImageLabels(url) .then(labels => { // You can use 'console.log(labels);' command to check labels you got // We filter all labels if they contain "hot dog" in label description // And have a score > 0.6, which mean that VisionAPI is at least 60% sure that there is a hotdog on a picture labels = labels.filter(function(label) { return label.description.toLowerCase().includes("hot dog") && label.score > 0.6; }); // If labels array contains at least 1 element, then we found a hot-dog! if (labels.length > 0) { response.status(200).json({isHotDog: true, error: ""}); } else { response.status(200).json({isHotDog: false, error: ""}); } }) .catch(err => { response.status(500).json({ error: err }); }); }; async function getImageLabels(imageUrl) { // Imports the Google Cloud client library const vision = require('@google-cloud/vision'); // Creates a client const client = new vision.ImageAnnotatorClient(); // Performs label detection on the image file const [result] = await client.labelDetection(imageUrl); const labels = result.labelAnnotations; return labels }

Qual é a diferença em comparação com a versão anterior? Adicionamos uma solicitação à VisionAPI, que retorna os ‘rótulos’ encontrados na imagem. Depois filtramos esses rótulos pela descrição: se contiver “hot dog” e se tiver mais de 60% de confiança nesse rótulo. Se houver pelo menos 1 rótulo restante após a filtragem, isso significa que encontramos um hotdog na imagem.
Recursos da API Vision | O que isso habilita em Fluxos |
|---|---|
Rótulos de objeto (por exemplo, “hot dog”) | Identificar objetos e automatizar ações com base na detecção |
Scores de confiança | Controlar precisão (por exemplo, > 60% de confiança aciona fluxo de trabalho) |
Extração de metadados | Incluir contexto como números, objetos e ambiente |
Biblioteca expansível | Adicionar mais detecções com poder de IA além de hot dogs |
Para entender como a API do Google Vision funciona e visualizar respostas de exemplo, verifique a documentação oficial da API Vision.
Depois disso, implante a nova versão da nossa função. Para testá-la a partir do seu navegador, encontre qualquer imagem de um hotdog e salve seu URL. Agora vá para o URL da sua função (inserindo o endereço correto para sua função) https://seu-endereco-da-funcao.cloudfunctions.net/HotDogOrNot?url=url_da_imagem e substitua o “url_da_imagem” pelo URL da imagem encontrada. Se houver um hotdog na imagem, a página retornará {“isHotDog”: true}.
Agora vamos conectar essa função ao Flow Builder.
Para torná-lo mais inteligente, vamos adicionar reconhecimento de imagem. Para este propósito, usaremos a API do Google Vision. Para começar, siga os passos 1-4 no guia de início rápido da API Vision. No tutorial, você ativará a API Vision e criará uma conta de serviço para usá-la.
Agora volte para a função em nuvem que você criou. Ative "Variáveis de ambiente, rede, tempos limite e mais" e no arquivo "Conta de serviço" escolha a conta de serviço VisionAPI que você acabou de criar. Agora podemos acessar a API Vision dentro da nossa função.

Agora vamos mudar o código. Na aba "Package.json", insira este código. Ele adicionará a biblioteca da API do Google Vision como uma dependência para sua função.
{ "name": "sample-http", "version": "0.0.1", "dependencies": { "@google-cloud/vision": "^1.11.0" } }
na aba "Index.js", atualize o código existente com o seguinte trecho de código.
/** * Responds to any HTTP request. * * @param {!express:Request} req HTTP request context. * @param {!express:Response} res HTTP response context. */ exports.helloWorld = (request, response) => { var url = request.query.url || request.body.url; if (url == null || url == "" ) { response.status(400).json({ error: "Must include a 'url' query parameter." }); } getImageLabels(url) .then(labels => { // You can use 'console.log(labels);' command to check labels you got // We filter all labels if they contain "hot dog" in label description // And have a score > 0.6, which mean that VisionAPI is at least 60% sure that there is a hotdog on a picture labels = labels.filter(function(label) { return label.description.toLowerCase().includes("hot dog") && label.score > 0.6; }); // If labels array contains at least 1 element, then we found a hot-dog! if (labels.length > 0) { response.status(200).json({isHotDog: true, error: ""}); } else { response.status(200).json({isHotDog: false, error: ""}); } }) .catch(err => { response.status(500).json({ error: err }); }); }; async function getImageLabels(imageUrl) { // Imports the Google Cloud client library const vision = require('@google-cloud/vision'); // Creates a client const client = new vision.ImageAnnotatorClient(); // Performs label detection on the image file const [result] = await client.labelDetection(imageUrl); const labels = result.labelAnnotations; return labels }

Qual é a diferença em comparação com a versão anterior? Adicionamos uma solicitação à VisionAPI, que retorna os ‘rótulos’ encontrados na imagem. Depois filtramos esses rótulos pela descrição: se contiver “hot dog” e se tiver mais de 60% de confiança nesse rótulo. Se houver pelo menos 1 rótulo restante após a filtragem, isso significa que encontramos um hotdog na imagem.
Recursos da API Vision | O que isso habilita em Fluxos |
|---|---|
Rótulos de objeto (por exemplo, “hot dog”) | Identificar objetos e automatizar ações com base na detecção |
Scores de confiança | Controlar precisão (por exemplo, > 60% de confiança aciona fluxo de trabalho) |
Extração de metadados | Incluir contexto como números, objetos e ambiente |
Biblioteca expansível | Adicionar mais detecções com poder de IA além de hot dogs |
Para entender como a API do Google Vision funciona e visualizar respostas de exemplo, verifique a documentação oficial da API Vision.
Depois disso, implante a nova versão da nossa função. Para testá-la a partir do seu navegador, encontre qualquer imagem de um hotdog e salve seu URL. Agora vá para o URL da sua função (inserindo o endereço correto para sua função) https://seu-endereco-da-funcao.cloudfunctions.net/HotDogOrNot?url=url_da_imagem e substitua o “url_da_imagem” pelo URL da imagem encontrada. Se houver um hotdog na imagem, a página retornará {“isHotDog”: true}.
Agora vamos conectar essa função ao Flow Builder.
Criando um fluxo no Flows
Faça login no Painel do Bird ou inscreva-se para uma conta se você não tiver uma.
Se você é novo no Flows e não configurou nenhum canal, você precisará ir para a página de configuração do Canal e escolher configurar o canal do Telegram. Eu escolhi o Telegram para esta demonstração porque é fácil e rápido de configurar.

Agora você tem um canal que podemos usar no Flows. Vá para a página de Flows, crie um novo fluxo personalizado e escolha o gatilho do canal “Telegram”.

Você será redirecionado para uma página de fluxo, onde deverá escolher seu canal do Telegram como o gatilho, no nosso caso é “Hotdog”. Por favor, adicione 2 etapas: “Buscar variáveis” e “Responder à mensagem do canal”.
Dentro da etapa “Buscar variáveis”, chamaremos nossa função em nuvem e recuperaremos a resposta na variável “isHotDog” que conterá “true” ou “false” como resposta da função GoogleCloud. No campo URL insira a URL da sua função https://your-function-address.cloudfunctions.net/HotDogOrNot e preencha todos os outros campos como na imagem do "Conteúdo da etapa de buscar variável".
E dentro da etapa “Responder à mensagem do canal”, responderemos ao cliente com uma mensagem contendo a resposta sim ou não. Para isso, insira no campo "Responder com mensagem" o seguinte texto "Hotdog na imagem? {{isHotDog}}".


Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "19c3560f-a8d0-4787-8714-37c698108b69", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Is there a hotdog on the image?", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "ca9314a2-2f9d-489c-b4b1-50fc7a0b2cb6", "action": "sendConversationMessage", "options": { "content": { "text": "Hotdog on the image? {{isHotDog}}", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "highThroughput": false } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:15:43.669252097Z", "revisionCount": 22 }

Para testar, envie uma imagem para seu bot do Telegram.
Até agora, está legal! Criamos um pequeno chatbot que verifica as imagens enviadas pelos clientes. Para deixá-lo mais bonito, vamos adicionar mais algumas etapas, como mostrado abaixo:

Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "0c3e4f35-0950-44dd-8682-0a21a111de77", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{messageImage}}", "operator": "isEmptyOrNotSet", "value": "", "options": { "intent": "custom" } } ], "steps": [ { "id": "ffd13531-a3b9-41de-a2fa-0e515feed2fe", "action": "sendConversationMessage", "options": { "content": { "text": "Please send an image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Ask to send an image", "highThroughput": false } }, { "id": "3d752bc6-cf35-4971-8155-44a2bea4bb49", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "aa_QVqjIn9" } ], "defaultCase": { "steps": [ { "id": "8f3748cf-9059-44fb-a177-bc0dab194e7b", "action": "sendConversationMessage", "options": { "content": { "text": "Thank you for the image! We started to detect a hotdog on the image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"Thanks for the image\"", "highThroughput": false } }, { "id": "808debc0-974d-4b3f-bd4f-ed4efb30a499", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Send image to VisionAPI", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "c9f771fb-06ff-4362-b783-07e4bd3ff53d", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{isHotDog}}", "operator": "==", "value": "true", "options": { "intent": "custom" } } ], "steps": [ { "id": "02629417-e3ac-4bfa-94a9-83047c250d54", "action": "sendConversationMessage", "options": { "content": { "text": "There is a hotdog on the image. Thank you!", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"we detected a hotdog!\"", "highThroughput": false } } ], "id": "AWzLv6jksY" } ], "defaultCase": { "steps": [ { "id": "b00034ce-db49-4ddf-bf8f-2be006e3fbbd", "action": "sendConversationMessage", "options": { "content": { "text": "Sorry, we didn't detect a hotdog on the image. Please try again.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Notify that we didn't detect a hotdog", "highThroughput": false } } ], "id": "mwk5RoiCo" }, "intent": "smsConditional" } }, { "id": "8778c563-c045-4aa6-80e5-4c2a29b38b3f", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "iuFXBNrWTr" }, "intent": "smsConditional", "label": "Check if user sent an image" } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:25:15.614170299Z", "revisionCount": 26 }
Faça login no Painel do Bird ou inscreva-se para uma conta se você não tiver uma.
Se você é novo no Flows e não configurou nenhum canal, você precisará ir para a página de configuração do Canal e escolher configurar o canal do Telegram. Eu escolhi o Telegram para esta demonstração porque é fácil e rápido de configurar.

Agora você tem um canal que podemos usar no Flows. Vá para a página de Flows, crie um novo fluxo personalizado e escolha o gatilho do canal “Telegram”.

Você será redirecionado para uma página de fluxo, onde deverá escolher seu canal do Telegram como o gatilho, no nosso caso é “Hotdog”. Por favor, adicione 2 etapas: “Buscar variáveis” e “Responder à mensagem do canal”.
Dentro da etapa “Buscar variáveis”, chamaremos nossa função em nuvem e recuperaremos a resposta na variável “isHotDog” que conterá “true” ou “false” como resposta da função GoogleCloud. No campo URL insira a URL da sua função https://your-function-address.cloudfunctions.net/HotDogOrNot e preencha todos os outros campos como na imagem do "Conteúdo da etapa de buscar variável".
E dentro da etapa “Responder à mensagem do canal”, responderemos ao cliente com uma mensagem contendo a resposta sim ou não. Para isso, insira no campo "Responder com mensagem" o seguinte texto "Hotdog na imagem? {{isHotDog}}".


Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "19c3560f-a8d0-4787-8714-37c698108b69", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Is there a hotdog on the image?", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "ca9314a2-2f9d-489c-b4b1-50fc7a0b2cb6", "action": "sendConversationMessage", "options": { "content": { "text": "Hotdog on the image? {{isHotDog}}", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "highThroughput": false } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:15:43.669252097Z", "revisionCount": 22 }

Para testar, envie uma imagem para seu bot do Telegram.
Até agora, está legal! Criamos um pequeno chatbot que verifica as imagens enviadas pelos clientes. Para deixá-lo mais bonito, vamos adicionar mais algumas etapas, como mostrado abaixo:

Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "0c3e4f35-0950-44dd-8682-0a21a111de77", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{messageImage}}", "operator": "isEmptyOrNotSet", "value": "", "options": { "intent": "custom" } } ], "steps": [ { "id": "ffd13531-a3b9-41de-a2fa-0e515feed2fe", "action": "sendConversationMessage", "options": { "content": { "text": "Please send an image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Ask to send an image", "highThroughput": false } }, { "id": "3d752bc6-cf35-4971-8155-44a2bea4bb49", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "aa_QVqjIn9" } ], "defaultCase": { "steps": [ { "id": "8f3748cf-9059-44fb-a177-bc0dab194e7b", "action": "sendConversationMessage", "options": { "content": { "text": "Thank you for the image! We started to detect a hotdog on the image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"Thanks for the image\"", "highThroughput": false } }, { "id": "808debc0-974d-4b3f-bd4f-ed4efb30a499", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Send image to VisionAPI", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "c9f771fb-06ff-4362-b783-07e4bd3ff53d", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{isHotDog}}", "operator": "==", "value": "true", "options": { "intent": "custom" } } ], "steps": [ { "id": "02629417-e3ac-4bfa-94a9-83047c250d54", "action": "sendConversationMessage", "options": { "content": { "text": "There is a hotdog on the image. Thank you!", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"we detected a hotdog!\"", "highThroughput": false } } ], "id": "AWzLv6jksY" } ], "defaultCase": { "steps": [ { "id": "b00034ce-db49-4ddf-bf8f-2be006e3fbbd", "action": "sendConversationMessage", "options": { "content": { "text": "Sorry, we didn't detect a hotdog on the image. Please try again.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Notify that we didn't detect a hotdog", "highThroughput": false } } ], "id": "mwk5RoiCo" }, "intent": "smsConditional" } }, { "id": "8778c563-c045-4aa6-80e5-4c2a29b38b3f", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "iuFXBNrWTr" }, "intent": "smsConditional", "label": "Check if user sent an image" } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:25:15.614170299Z", "revisionCount": 26 }
Faça login no Painel do Bird ou inscreva-se para uma conta se você não tiver uma.
Se você é novo no Flows e não configurou nenhum canal, você precisará ir para a página de configuração do Canal e escolher configurar o canal do Telegram. Eu escolhi o Telegram para esta demonstração porque é fácil e rápido de configurar.

Agora você tem um canal que podemos usar no Flows. Vá para a página de Flows, crie um novo fluxo personalizado e escolha o gatilho do canal “Telegram”.

Você será redirecionado para uma página de fluxo, onde deverá escolher seu canal do Telegram como o gatilho, no nosso caso é “Hotdog”. Por favor, adicione 2 etapas: “Buscar variáveis” e “Responder à mensagem do canal”.
Dentro da etapa “Buscar variáveis”, chamaremos nossa função em nuvem e recuperaremos a resposta na variável “isHotDog” que conterá “true” ou “false” como resposta da função GoogleCloud. No campo URL insira a URL da sua função https://your-function-address.cloudfunctions.net/HotDogOrNot e preencha todos os outros campos como na imagem do "Conteúdo da etapa de buscar variável".
E dentro da etapa “Responder à mensagem do canal”, responderemos ao cliente com uma mensagem contendo a resposta sim ou não. Para isso, insira no campo "Responder com mensagem" o seguinte texto "Hotdog na imagem? {{isHotDog}}".


Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "19c3560f-a8d0-4787-8714-37c698108b69", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Is there a hotdog on the image?", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "ca9314a2-2f9d-489c-b4b1-50fc7a0b2cb6", "action": "sendConversationMessage", "options": { "content": { "text": "Hotdog on the image? {{isHotDog}}", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "highThroughput": false } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:15:43.669252097Z", "revisionCount": 22 }

Para testar, envie uma imagem para seu bot do Telegram.
Até agora, está legal! Criamos um pequeno chatbot que verifica as imagens enviadas pelos clientes. Para deixá-lo mais bonito, vamos adicionar mais algumas etapas, como mostrado abaixo:

Se você tiver problemas para construir o fluxo, pode usar o seguinte snippet:
{ "id": "", "revisionId": "", "trigger": "onReceivedConversationMessage", "options": { "callbacks": [], "targets": [] }, "metadata": { "title": "Image recognition", "isDraft": false, "triggerIntent": "onReceivedTelegramMessage" }, "steps": [ { "id": "0c3e4f35-0950-44dd-8682-0a21a111de77", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{messageImage}}", "operator": "isEmptyOrNotSet", "value": "", "options": { "intent": "custom" } } ], "steps": [ { "id": "ffd13531-a3b9-41de-a2fa-0e515feed2fe", "action": "sendConversationMessage", "options": { "content": { "text": "Please send an image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Ask to send an image", "highThroughput": false } }, { "id": "3d752bc6-cf35-4971-8155-44a2bea4bb49", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "aa_QVqjIn9" } ], "defaultCase": { "steps": [ { "id": "8f3748cf-9059-44fb-a177-bc0dab194e7b", "action": "sendConversationMessage", "options": { "content": { "text": "Thank you for the image! We started to detect a hotdog on the image.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"Thanks for the image\"", "highThroughput": false } }, { "id": "808debc0-974d-4b3f-bd4f-ed4efb30a499", "action": "fetchVariables", "options": { "url": "https://your-function-address.cloudfunctions.net/HotDogOrNot", "variableKeys": [ "isHotDog" ], "intent": "fetchVariables", "label": "Send image to VisionAPI", "method": "POST", "body": "{\"url\":\"{{messageImage}}\"}", "contentType": "application/json" } }, { "id": "c9f771fb-06ff-4362-b783-07e4bd3ff53d", "action": "switch", "options": { "cases": [ { "conditions": [ { "variable": "{{isHotDog}}", "operator": "==", "value": "true", "options": { "intent": "custom" } } ], "steps": [ { "id": "02629417-e3ac-4bfa-94a9-83047c250d54", "action": "sendConversationMessage", "options": { "content": { "text": "There is a hotdog on the image. Thank you!", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Send \"we detected a hotdog!\"", "highThroughput": false } } ], "id": "AWzLv6jksY" } ], "defaultCase": { "steps": [ { "id": "b00034ce-db49-4ddf-bf8f-2be006e3fbbd", "action": "sendConversationMessage", "options": { "content": { "text": "Sorry, we didn't detect a hotdog on the image. Please try again.", "image": { "url": "" }, "audio": { "url": "" }, "video": { "url": "" }, "file": { "url": "" }, "location": { "latitude": "", "longitude": "" }, "email": { "from": { "name": "", "address": "" }, "subject": "", "content": {}, "headers": null } }, "type": "text", "recipients": { "conversationIds": [ "{{conversationId}}" ] }, "intent": "replyConversationMessage", "label": "Notify that we didn't detect a hotdog", "highThroughput": false } } ], "id": "mwk5RoiCo" }, "intent": "smsConditional" } }, { "id": "8778c563-c045-4aa6-80e5-4c2a29b38b3f", "action": "endFlow", "options": { "intent": "endFlow" } } ], "id": "iuFXBNrWTr" }, "intent": "smsConditional", "label": "Check if user sent an image" } } ], "published": true, "createdAt": "2020-08-28T18:25:19.665815708Z", "updatedAt": "2020-08-29T01:25:15.614170299Z", "revisionCount": 26 }
Resultados


Enquanto este é um exemplo divertido, acreditamos que esse tipo de funcionalidade pode ser muito útil para nossos usuários.
Se você quiser mais recursos como este integrados no Flows, escreva para nossa equipe de suporte para nos informar.


Enquanto este é um exemplo divertido, acreditamos que esse tipo de funcionalidade pode ser muito útil para nossos usuários.
Se você quiser mais recursos como este integrados no Flows, escreva para nossa equipe de suporte para nos informar.


Enquanto este é um exemplo divertido, acreditamos que esse tipo de funcionalidade pode ser muito útil para nossos usuários.
Se você quiser mais recursos como este integrados no Flows, escreva para nossa equipe de suporte para nos informar.



