{
  "name": "[TEMPLATE DO SDR.IA] AGENTE-VENDE",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "47d14fa0-51b0-4901-a4cb-ba1705560e04",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -2220,
        1060
      ],
      "id": "fa687781-959b-4731-9890-c18bd96ae0a1",
      "name": "Webhook",
      "webhookId": "47d14fa0-51b0-4901-a4cb-ba1705560e04"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "ea9512f2-e67c-4ef7-992f-893c75cfee8f",
              "leftValue": "={{ $json.fromMe }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": "=",
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -940,
        1060
      ],
      "id": "2bf8131f-8c51-47e4-bcac-5b2fb0024b8f",
      "name": "If"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "6de225a3-3524-4810-8ce2-6b96d1dff463",
              "leftValue": "={{ $json.combinedText1 }}",
              "rightValue": "={{ $json.combinedText2 }}",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        5080,
        1300
      ],
      "id": "20d75450-aad5-41d0-841e-2afcf8f3edcc",
      "name": "Filter"
    },
    {
      "parameters": {
        "operation": "toBinary",
        "sourceProperty": "=base64",
        "options": {
          "fileName": "transcricao.ogg",
          "mimeType": "audio/ogg"
        }
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        1440,
        1800
      ],
      "id": "45771b33-fcb0-4d0d-aae9-c9126ec7221b",
      "name": "Base64 to Audio"
    },
    {
      "parameters": {
        "operation": "toBinary",
        "sourceProperty": "base64",
        "options": {
          "fileName": "imagem.jpeg",
          "mimeType": "image/jpeg"
        }
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        1440,
        2540
      ],
      "id": "031058f2-984c-42e0-a7fb-69c9e644a9c3",
      "name": "Base64 to Image"
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "LEADS",
        "filters": {
          "conditions": [
            {
              "keyName": "number",
              "condition": "eq",
              "keyValue": "={{ $json.remoteJid }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "timeout",
              "fieldValue": "={{ $now.plus($json.time_out, minutes) }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        -620,
        660
      ],
      "id": "707d9a7c-4fb9-41ee-a1d5-0248103573b4",
      "name": "Supabase",
      "alwaysOutputData": true,
      "retryOnFail": false,
      "maxTries": 5,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "tableId": "LEADS",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "number",
              "fieldValue": "={{ $('Dados').item.json.remoteJid }}"
            },
            {
              "fieldId": "timeout",
              "fieldValue": "={{ $now.plus($json.time_out, minutes) }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        320,
        640
      ],
      "id": "6e33704f-545f-4dd0-98e7-87bd70c175cc",
      "name": "Supabase1",
      "retryOnFail": true,
      "maxTries": 5,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "operation": "get",
        "tableId": "LEADS",
        "filters": {
          "conditions": [
            {
              "keyName": "number",
              "keyValue": "={{ $('Dados').item.json.remoteJid }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        -660,
        1540
      ],
      "id": "d7dfe153-bb0e-49b2-95b7-c1aff8493df3",
      "name": "Supabase2",
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "9052c4ba-c9eb-468b-a15e-2eb63821823e",
              "leftValue": "={{ $json.isEmpty() }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -260,
        1540
      ],
      "id": "f93b8ea7-5639-40a4-ae18-26a63e8800ea",
      "name": "Number exist?"
    },
    {
      "parameters": {
        "tableId": "LEADS",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "created_at",
              "fieldValue": "={{ $('Dados').item.json.date_time }}"
            },
            {
              "fieldId": "number",
              "fieldValue": "={{ $('Dados').item.json.remoteJid }}"
            },
            {
              "fieldId": "lead_name",
              "fieldValue": "={{ $('If').item.json.nome }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        200,
        1880
      ],
      "id": "10139a7d-a184-4b94-b173-bbb5b0ef236c",
      "name": "Supabase3",
      "retryOnFail": true,
      "maxTries": 5,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "d5160a5e-d2cc-455a-b97f-c93e32746ecd",
              "leftValue": "={{ $now }}",
              "rightValue": "={{ $json.timeout }}",
              "operator": {
                "type": "dateTime",
                "operation": "after"
              }
            },
            {
              "id": "9d3259e9-f4f2-46b0-81ca-ed62c053f425",
              "leftValue": "={{ $json.timeout }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        200,
        1640
      ],
      "id": "00e8edd3-243d-430d-b49c-1fb6258aefe6",
      "name": "In manual service?",
      "disabled": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "5d408baf-2ff4-43fb-94a1-79601221051a",
              "name": "base64",
              "value": "={{ $('Webhook').item.json.body.data.message.base64 }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1200,
        1800
      ],
      "id": "63c0af8e-54b7-400b-9998-9f0d6d86a449",
      "name": "Base64 Audio"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "176cb5f8-02ec-4db5-bd04-6889859eb6aa",
              "name": "base64",
              "value": "={{ $('Webhook').item.json.body.data.message.base64 }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1200,
        2540
      ],
      "id": "f2e39435-9240-4dbe-9ee1-e8a043822d5b",
      "name": "Base64 Image"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        5500,
        2140
      ],
      "id": "8b011dac-62bf-4e59-a431-f2b131632564",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "9052c4ba-c9eb-468b-a15e-2eb63821823e",
              "leftValue": "={{ $json.isEmpty() }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -260,
        660
      ],
      "id": "984cc614-3353-40c1-9f09-6bf0e7ebff7c",
      "name": "Number exist?1"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        320,
        440
      ],
      "id": "04d13d6f-5b6a-4a4c-8832-a369b76a10e4",
      "name": "No Operation, do nothing"
    },
    {
      "parameters": {
        "amount": 20
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        3280,
        1760
      ],
      "id": "06afe4a9-1a40-4d34-80f0-82db21548f27",
      "name": "Delay",
      "webhookId": "a4ab3b31-e6b4-4a53-9c49-89020c15cf5d"
    },
    {
      "parameters": {
        "operation": "push",
        "list": "={{ $('Dados').item.json.remoteJid }}",
        "messageData": "={{ $('Dados').item.json.conversation }}",
        "tail": true
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        2660,
        1540
      ],
      "id": "7b8d1a9c-b691-447f-934a-181136d2a7c3",
      "name": "Memória de Texto"
    },
    {
      "parameters": {
        "operation": "push",
        "list": "={{ $('Dados').item.json.remoteJid }}",
        "messageData": "={{ $json.text }}",
        "tail": true
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        2120,
        1800
      ],
      "id": "f9a7a2c6-c1fe-4c96-81d4-582fb8b5cf1e",
      "name": "Memória de Áudio"
    },
    {
      "parameters": {
        "operation": "push",
        "list": "={{ $('Dados').item.json.remoteJid }}",
        "messageData": "={{ $json.content }}"
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        2120,
        2540
      ],
      "id": "8d354077-48e4-4d6e-9393-e27cdf59d46e",
      "name": "Memória de Imagem"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $('Dados').item.json.messageType }}",
                    "rightValue": "conversation",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Text"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "0807bcd7-a626-40ca-ae74-45f5565d9209",
                    "leftValue": "={{ $('Dados').item.json.messageType }}",
                    "rightValue": "audioMessage",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Audio"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "c8a4fecd-1016-4894-a4b4-859d9b73612c",
                    "leftValue": "={{ $('Dados').item.json.messageType }}",
                    "rightValue": "imageMessage",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Image"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        600,
        1560
      ],
      "id": "5a67dbca-743f-4bcf-98c4-0893235422c8",
      "name": "Tipo de Mensagem",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "8df33b65-c374-45c8-a755-e7d5806f6564",
              "leftValue": "={{ $json.remoteJid }}",
              "rightValue": "={{ $json.remoteJid }}",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        -1340,
        1060
      ],
      "id": "459f06db-0152-44f6-8653-df5d287a837d",
      "name": "Limitador de Número"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "2911e082-e712-4b85-bcf7-611f60d1559f",
              "name": "remoteJid",
              "value": "={{ $json.body.data.key.remoteJid }}",
              "type": "string"
            },
            {
              "id": "f2af5f89-8957-4811-9839-8ef571b38e5c",
              "name": "fromMe",
              "value": "={{ $json.body.data.key.fromMe }}",
              "type": "boolean"
            },
            {
              "id": "16a9c5c0-5a35-4db2-ab94-ef251115696f",
              "name": "conversation",
              "value": "={{ $json.body.data.message.conversation }}",
              "type": "string"
            },
            {
              "id": "20937be5-8999-4d95-91cb-5aa9490f166c",
              "name": "date_time",
              "value": "={{ $json.body.date_time }}",
              "type": "string"
            },
            {
              "id": "fa5a0f16-b265-40ab-9299-135659bbf90e",
              "name": "messageType",
              "value": "={{ $json.body.data.messageType }}",
              "type": "string"
            },
            {
              "id": "95ca6185-7794-4411-82c5-d30676a6ca52",
              "name": "evo.instance",
              "value": "={{ $json.body.instance }}",
              "type": "string"
            },
            {
              "id": "66fcd40d-88da-4117-958d-7b4a29454136",
              "name": "evo.server_url",
              "value": "={{ $json.body.server_url }}",
              "type": "string"
            },
            {
              "id": "477ee9d8-59d3-4dd4-9eab-038367517cb1",
              "name": "evo.apikey",
              "value": "={{ $json.body.apikey }}",
              "type": "string"
            },
            {
              "id": "89c694a3-3a94-4bf2-8d8d-016bafa3040e",
              "name": "time_out",
              "value": 15,
              "type": "number"
            },
            {
              "id": "303974ab-9903-4fae-af14-73438a4d98b8",
              "name": "nome",
              "value": "={{ $json.body.data.pushName }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -1760,
        1060
      ],
      "id": "c51edacd-8d56-4c08-8ddb-e857314df4d0",
      "name": "Dados"
    },
    {
      "parameters": {
        "jsCode": "// Recebe todos os itens de entrada\nconst items = $input.all();\n\n// Verifica se há itens de entrada\nif (!items || items.length === 0) {\n  return []; // Retorna um array vazio se não houver entrada\n}\n\n// Array para armazenar os resultados\nconst output = [];\n\n// Processa cada item de entrada\nitems.forEach(item => {\n  // Assume que o texto está no campo \"splitPart\" do item\n  const text = item.json.splitPart || \"\";\n\n  // Conta o número de caracteres na mensagem\n  const characterCount = text.length;\n\n  // Calcula o tempo em milissegundos: 100 caracteres = 7 segundos (7000 ms)\n  const milliseconds = Math.floor((characterCount / 100) * 7000);\n\n  // Adiciona o resultado ao array de saída\n  output.push({ json: { milliseconds } });\n});\n\n// Retorna os resultados\nreturn output;\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        7440,
        2840
      ],
      "id": "6ce0a61f-6ca0-42de-8a29-b68c2f832eba",
      "name": "Contabilizar Caracteres"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://SEU-DOMINIO/message/sendText/NOME-DA-SUA-INSTANCIA",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apiKey ",
              "value": "={{ $('Dados').first().json.evo.apikey }}"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "number",
              "value": "={{ $('Dados').first().json.remoteJid }}"
            },
            {
              "name": "text",
              "value": "={{ $('Loop Over Items').item.json.result }}"
            },
            {
              "name": "delay",
              "value": "={{ $json.milliseconds }}"
            }
          ]
        },
        "options": {
          "allowUnauthorizedCerts": true
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        7880,
        2840
      ],
      "id": "7cc6866f-63eb-48aa-b03b-5ac5a27eefc6",
      "name": "Enviar Texto"
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.7,
      "position": [
        1740,
        1800
      ],
      "id": "b65ab669-231f-468d-8629-2cdd6b82cc2e",
      "name": "Transcreve Áudio"
    },
    {
      "parameters": {
        "resource": "image",
        "operation": "analyze",
        "modelId": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "GPT-4O-MINI"
        },
        "text": "Descreva todo o conteúdo da imagem",
        "inputType": "base64",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.7,
      "position": [
        1760,
        2540
      ],
      "id": "75258ec8-9f32-4829-ad5b-888b3cfe3884",
      "name": "Analisa a Imagem"
    },
    {
      "parameters": {
        "content": "## **SDR.IA - Inteligência Artificial do Atendimento**\n\n### **Nome do Nó:** `SDR.IA`\n\n- **O que faz?**\n    - Usa **inteligência artificial (OpenAI GPT-4o)** para interpretar a mensagem do cliente e escolher a ação correta.\n- **Por que existe?**\n    - Para permitir que o bot entenda a mensagem do usuário e escolha a melhor resposta.\n- **Como funciona?**\n    - O nó recebe a mensagem filtrada e, com base no conteúdo, decide **se é necessário agendar, reagendar, cancelar ou conferir disponibilidade**.\n- **O que acontece depois?**\n    - Dependendo da resposta da IA, a mensagem é enviada para um dos nós seguintes (`dia_semana`, `agendamento`, `cancelamento`, etc.).",
        "height": 820,
        "width": 1040,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5400,
        420
      ],
      "id": "c350a6a8-9496-4018-b2f7-22b2dc421fbc",
      "name": "Sticky Note27"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.elevenlabs.io/v1/text-to-speech/ID-DA-VOZ",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "xi-api-key",
              "value": "SUA CHAVE API KEY DO ELEVEN LABS"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "text",
              "value": "={{ $('Loop Over Items').item.json.result }}"
            },
            {
              "name": "model_id",
              "value": "eleven_flash_v2_5"
            },
            {
              "name": "speed",
              "value": "1.0"
            },
            {
              "name": "stability",
              "value": "0.5"
            },
            {
              "name": "similarity",
              "value": "0.2"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        5840,
        3820
      ],
      "id": "6670337a-5fd6-4d25-b9d7-a99c8d060140",
      "name": "Eleven Labs"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "957d4389-8eca-479c-8829-625728cf38be",
                    "leftValue": "={{ $json.randomNumber }}",
                    "rightValue": 1,
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Texto"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "002d5ccf-2569-4b9e-8a80-1410f7874c0e",
                    "leftValue": "={{ $json.randomNumber }}",
                    "rightValue": 2,
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Texto"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "b274180e-e92f-4562-8d5e-b8bd3dccb55b",
                    "leftValue": "={{ $json.randomNumber }}",
                    "rightValue": 3,
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Audio"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "5ff762af-4df5-4cc3-a8b5-ee10b3bed4b6",
                    "leftValue": "={{ $json.randomNumber }}",
                    "rightValue": 4,
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Audio"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        6900,
        2820
      ],
      "id": "5c002cb2-547a-4efb-a77d-e7c8a3baabf9",
      "name": "Switch"
    },
    {
      "parameters": {
        "operation": "binaryToPropery",
        "destinationKey": "base64",
        "options": {
          "encoding": "base64"
        }
      },
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1,
      "position": [
        6260,
        3820
      ],
      "id": "6732324e-f294-4083-9afa-552a2320c1ea",
      "name": "Extract from File"
    },
    {
      "parameters": {
        "jsCode": "function generateRandomNumber() {\n    return Math.floor(Math.random() * 4) + 1;\n}\n\nreturn [{ json: { randomNumber: generateRandomNumber() } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        6380,
        2840
      ],
      "id": "384247c2-1424-4038-aa1d-1a87e201d813",
      "name": "Número Aleatório"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://SEU-DOMINIO/message/sendWhatsAppAudio/NOME-DA-SUA-INSTANCIA",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $('Dados').first().json.evo.apikey }}"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "number",
              "value": "={{ $('Dados').first().json.remoteJid }}"
            },
            {
              "name": "audio",
              "value": "={{ $json.base64 }}"
            }
          ]
        },
        "options": {
          "allowUnauthorizedCerts": true
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        6700,
        3820
      ],
      "id": "87ca45a6-9e58-4676-85c9-6e37160f2d88",
      "name": "Enviar Audio",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "jsCode": "// Obtém o conteúdo da mensagem do item anterior\nconst message = $input.item.json;\nlet messageText = '';\n\n// Verifica se a mensagem está em diferentes formatos possíveis\nif (typeof message === 'string') {\n  messageText = message;\n} else if (message.content) {\n  messageText = message.content;\n} else if (message.text) {\n  messageText = message.text;\n} else if (message.message) {\n  messageText = message.message;\n}\n\n// LOG PARA DEPURAÇÃO (Remova depois de testar)\nconsole.log(\"Texto analisado:\", messageText);\n\n// Expressões regulares para identificar datas, dias da semana e horários\nconst dateRegex = /\\b(?:\\d{1,2})[/-](?:\\d{1,2})[/-](?:\\d{2,4})\\b/g; // Captura formatos: 07/03/2025, 6-3-2025\nconst weekDayRegex = /\\b(?:segunda|terça|quarta|quinta|sexta|sábado|domingo)-feira\\b/gi; // Captura: Sexta-feira\nconst timeRegex = /\\b(?:\\d{1,2}[:h]\\d{2})\\b/g; // Captura: 09:00, 10h30, 14:00\nconst meetLinkRegex = /meet\\.google\\.com\\/[a-zA-Z0-9-]+/g; // Captura links completos do Meet\n\n// Verifica se há pelo menos um desses padrões no texto\nconst hasDate = dateRegex.test(messageText);\nconst hasWeekDay = weekDayRegex.test(messageText);\nconst hasTime = timeRegex.test(messageText);\nconst hasMeetLink = meetLinkRegex.test(messageText);\n\n// LOG PARA DEPURAÇÃO\nconsole.log(\"Contém Data?\", hasDate);\nconsole.log(\"Contém Dia da Semana?\", hasWeekDay);\nconsole.log(\"Contém Horário?\", hasTime);\nconsole.log(\"Contém Link do Meet?\", hasMeetLink);\n\n// Se qualquer um dos padrões for encontrado, define como true\nconst hasScheduleInfo = hasDate || hasWeekDay || hasTime || hasMeetLink;\n\n// Adiciona o resultado como uma nova propriedade ao item\n$input.item.json.isMeetSchedule = hasScheduleInfo;\n\n// Retorna o item modificado\nreturn $input.item;\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5800,
        2860
      ],
      "id": "06c8bccd-1912-4be6-89de-6274ca1dcaf5",
      "name": "Code"
    },
    {
      "parameters": {
        "jsCode": "function getDayOfWeek(query) {\n    const [day, month, year] = query.split('/').map(Number);\n    const date = new Date(year, month - 1, day);\n    return date.toLocaleDateString('pt-BR', { weekday: 'long' });\n}\n\n// Array para armazenar os próximos 10 dias\nconst next10Days = [];\n\nfor (let i = 0; i < 10; i++) {\n    const date = new Date();\n    date.setDate(date.getDate() + i);\n\n    next10Days.push(` ${date.toLocaleDateString('pt-BR', { weekday: 'long' })}, ${date.toLocaleDateString('pt-BR')}`);\n}\n\nreturn [{ json: { resultado: next10Days.join('\\n') } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        4660,
        1300
      ],
      "id": "2ae1ddeb-2406-4220-8f33-0e30ff783071",
      "name": "Organizar Dias"
    },
    {
      "parameters": {
        "name": "agendamento",
        "description": "=Chame esta ferramenta após o usuário informar nome e email e data do agendamento. \n\nNa variável \"nome\", você vai preencher o nome do usuário\n\nNa variável \"email\" você vai preencher o email do usuário\n\nNa variável \"dia\" você vai preencher o dia desejado que ele tem mais facilidade em fazer a call\n\nNa variável \"histórico\" você vai subir o histórico das ultimas 3 mensagens.\n\n\nA data do agendamento você vai transformar para seguinte formato, exemplo: dd/mm/yyyy HH:MM:SS -03:00\n\nEm seguida você vai inserir uma hora a mais depois no horario de agendamento e na variavel \"end\" você vai prencher com o horario no mesmo formato da variavel start",
        "workflowId": {
          "__rl": true,
          "value": "pEmfDrdbeB16KG0V",
          "mode": "list",
          "cachedResultName": "AGENDAMENTO"
        },
        "fields": {
          "values": [
            {
              "name": "Evento",
              "stringValue": "agendamento"
            },
            {
              "name": "Nome",
              "stringValue": "={{ $fromAI(\"nome\",\"email do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "Email",
              "stringValue": "={{ $fromAI(\"email\",\"email do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "Hora_desejada",
              "stringValue": "={{ $fromAI(\"hora\",\"email do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "whatsappid",
              "stringValue": "={{ $json.sessionId }}"
            },
            {
              "name": "Historico_conversas",
              "stringValue": "={{ $('Dados').item.json.conversation }}"
            }
          ]
        },
        "specifyInputSchema": true,
        "jsonSchemaExample": "{\n  \"nome\": \"\",\n  \"email\": \"\",\n  \"tipo_evento\": \"reagendamento\",\n  \"horario\": \"\",\n  \"conversationStory\": \"\"\n}\n"
      },
      "id": "05f741c4-6d09-4400-a20c-f1f586345eb0",
      "name": "agendamento",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 1.2,
      "position": [
        5860,
        1040
      ]
    },
    {
      "parameters": {
        "name": "REagendar",
        "description": "=Após o usuário informar que quer REAGENDAR ou que já tem horário, e colete o nome, email e nova data Chame esta tool\n\nNa variável \"nome\", você vai preencher o nome do usuário e na variavel \"email\" você vai preencher com email do usuário\n\nA data do agendamento você vai transformar para seguinte formato, exemplo: 2024-10-18T14:30:00-03:00 e vai preencher a variavel \"start\"\n\nEm seguida você vai inserir uma hora a mais depois no horario de agendamento e na variavel \"end\" você vai prencher com o horario no mesmo formato da variavel start",
        "workflowId": {
          "__rl": true,
          "value": "pEmfDrdbeB16KG0V",
          "mode": "list",
          "cachedResultName": "AGENDAMENTO"
        },
        "fields": {
          "values": [
            {
              "name": "Evento",
              "stringValue": "reagendamento"
            },
            {
              "name": "Email",
              "stringValue": "={{ $fromAI(\"email_cliente\",\"email do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "Nome",
              "stringValue": "={{ $fromAI(\"nome_cliente\",\"nome do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "whatsappId",
              "stringValue": "={{ $json.sessionId }}"
            },
            {
              "name": "Historico_conversas",
              "stringValue": "={{ $('Dados').first.json.conversation }}"
            }
          ]
        },
        "specifyInputSchema": true,
        "jsonSchemaExample": "{\n  \"nome\": \"\",\n  \"email\": \"\",\n  \"tipo_evento\": \"reagendamento\",\n  \"horario\": \"\",\n  \"conversationStory\": \"\"\n}\n"
      },
      "id": "0349c307-e565-4256-a79c-8a71c74bd818",
      "name": "reagendamento",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 1.2,
      "position": [
        5720,
        1040
      ]
    },
    {
      "parameters": {
        "resource": "assistant",
        "assistantId": {
          "__rl": true,
          "value": "asst_cev5SvSnQPa426myufijySDd",
          "mode": "list",
          "cachedResultName": "LÚCIO SDR"
        },
        "prompt": "define",
        "text": "=Mensagem do Usuário (texto): {{ $('Dados').first().json.conversation }}\nor\nMensagem do Usuário (audio): {{ $('memory2').item.json.propertyName }}\n\nData da mensagem: {{ $now }}\n\n#NOTAS:\n\n-NÃO RETORNE UMA RESPOSTA EM MARKDOWN\n-NÃO RETORNE RESPOSTAS COM CARACTERES ESPECIAIS.",
        "options": {
          "preserveOriginalTools": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        5840,
        780
      ],
      "id": "4803c7a4-0e97-48eb-8432-13a5e77e7cdc",
      "name": "SDR.IA",
      "credentials": {
        "openAiApi": {
          "id": "enKhHqNKibYUkzcO",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "dfedefa7-3092-41bc-aaa2-a6233a9ff7be",
              "leftValue": "={{ $json.isMeetSchedule }}",
              "rightValue": "false",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            },
            {
              "id": "e6470749-19c7-4f69-9058-36d45969bdb5",
              "leftValue": "={{ $json.isMeetSchedule }}",
              "rightValue": "false",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        6380,
        2640
      ],
      "id": "2eabc591-7ade-40cf-9a77-05f1c6388393",
      "name": "If1"
    },
    {
      "parameters": {
        "operation": "delete",
        "key": "={{ $('Dados').first().json.remoteJid }}"
      },
      "id": "e6ea4883-be94-4271-a19c-ebc87b820c8a",
      "name": "Redis6",
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        5780,
        2000
      ]
    },
    {
      "parameters": {
        "name": "dia_semana",
        "description": "ESSA TOOL É OBRIGATÓRIA A SER A PRIMEIRA EXECUTADA PARA QUALQUER TIPO DE PROCESSO para identificar o dia da semana exato. Use essa tool para consultar o dia da semana.\nForneça como parâmetro uma data no formato dd/mm/yyyy",
        "jsCode": "const input = query;\n\n//AQUI O CHATGPT PODE SER LIVRE\nconst [day, month, year] = input.split('/').map(Number);\nconst date = new Date(year, month - 1, day);\n// ATÉ AQUI\nreturn date.toLocaleDateString('pt-BR', { weekday: 'long' });"
      },
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1.1,
      "position": [
        5440,
        1040
      ],
      "id": "77f7287b-8634-4116-9b90-ca8a48e3fa73",
      "name": "dia_semana"
    },
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "typeVersion": 1,
      "position": [
        6120,
        1040
      ],
      "id": "8a6b7403-e509-47b4-a840-7e0781ca9e5a",
      "name": "Calculator"
    },
    {
      "parameters": {
        "name": "disponibilidade",
        "description": "=CHAME ESTA TOOL PARA sempre que precisar conferir a DISPONIBILIDADE na agenda antes de agendar qualquer cliente e encontrar horários disponíveis.\n\nRegras:\nTraga apenas os horários disponíveis entre 09:00 e 18:00.\n\nConsidere os horários já ocupados e não marque nenhum agendamento nesses intervalos.\n\nRetorne exatamente 2 horários disponíveis por dia, considerando 3 dias diferentes.",
        "workflowId": {
          "__rl": true,
          "value": "pEmfDrdbeB16KG0V",
          "mode": "list",
          "cachedResultName": "AGENDAMENTO"
        },
        "fields": {
          "values": [
            {
              "name": "Evento",
              "stringValue": "disponibilidade"
            },
            {
              "name": "Historico_conversas",
              "stringValue": "={{ $('Dados').first().json.conversation }}"
            }
          ]
        },
        "specifyInputSchema": true,
        "jsonSchemaExample": "{\n  \"nome\": \"\",\n  \"email\": \"\",\n  \"tipo_evento\": \"disponibilidade\",\n  \"horario\": \"\",\n  \"conversationStory\": \"\"\n}\n"
      },
      "id": "1a7d204b-086e-4f99-a666-f30b1625b6c4",
      "name": "disponibilidade",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 1.2,
      "position": [
        6000,
        1040
      ]
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Dados').first().json.remoteJid }}",
        "tableName": "agentesdr",
        "contextWindowLength": 6
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        6240,
        1040
      ],
      "id": "2c494258-2158-4252-b379-94b93586bcac",
      "name": "Postgres Chat Memory"
    },
    {
      "parameters": {
        "jsCode": "// Obter os arrays de mensagens dos nós \"Get Memory 1\" e \"Get Memory 2\"\nconst messages1 = $('memory').item?.json?.propertyName || [];\nconst messages2 = $('memory2').item?.json?.propertyName || [];\n\n// Garantir que messages1 e messages2 são arrays antes de chamar join\nconst combinedText1 = Array.isArray(messages1) ? messages1.join(' ') : '';\nconst combinedText2 = Array.isArray(messages2) ? messages2.join(' ') : '';\n\n// Retornar os dois textos combinados como variáveis separadas\nreturn {\n    combinedText1,\n    combinedText2\n};\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        4020,
        1760
      ],
      "id": "56bf39c0-e5ac-4bd0-9b6b-769fb6e8c8b0",
      "name": "Code1"
    },
    {
      "parameters": {
        "name": "cancelamento",
        "description": "=Chame esta TOOL após o usuário informar que dedeseja cancelar, peça nome e email e data do agendamento. \n\nNa variável \"nome\", você vai preencher o nome do usuário\n\nNa variável \"email\" você vai preencher o email do usuário\n\nNa variável \"dia\" você vai preencher o dia desejado que ele tem mais facilidade em fazer a call\n\n\nA data do agendamento você vai transformar para seguinte formato, exemplo: dd/mm/yyyy HH:MM:SS -03:00\n\nEm seguida você vai inserir uma hora a mais depois no horario de agendamento e na variavel \"end\" você vai prencher com o horario no mesmo formato da variavel start",
        "workflowId": {
          "__rl": true,
          "value": "pEmfDrdbeB16KG0V",
          "mode": "list",
          "cachedResultName": "AGENDAMENTO"
        },
        "fields": {
          "values": [
            {
              "name": "Email",
              "stringValue": "={{ $fromAI(\"email_cliente\",\"email do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "Nome",
              "stringValue": "={{ $fromAI(\"nome_cliente\",\"nome do cliente para fazer agendamento\",\"string\",\"\")}}"
            },
            {
              "name": "evento",
              "stringValue": "cancelamento"
            },
            {
              "name": "whatsappID",
              "stringValue": "={{ $json.sessionId }}"
            },
            {
              "name": "historico_conversas",
              "stringValue": "={{ $('Dados').item.json.conversation }}"
            }
          ]
        },
        "specifyInputSchema": true,
        "jsonSchemaExample": "{\n  \"nome\": \"\",\n  \"email\": \"\",\n  \"tipo_evento\": \"cancelamento\",\n  \"horario\": \"\",\n  \"conversationStory\": \"\"\n}\n"
      },
      "id": "5cb93e33-3cec-4eb9-b046-42ea1ccf90a4",
      "name": "cancelamento",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 1.2,
      "position": [
        5580,
        1040
      ]
    },
    {
      "parameters": {
        "content": "- **Webhook - Recebendo Mensagens do WhatsApp**\n    \n    ### Nome: `Webhook`\n    \n    - **O que faz?**\n        - Captura **todas as mensagens recebidas** no WhatsApp e inicia o fluxo.\n    - **Por que existe?**\n        - O Webhook é um \"gatilho\", ou seja, um sensor que recebe a mensagem e dispara a automação.\n    - **Como funciona?**\n        - Ele recebe informações como:\n            - `remoteJid` → Número do cliente.\n            - `conversation` → Texto da mensagem.\n            - `messageType` → Se é **texto, áudio ou imagem**.\n    - **O que acontece depois?**\n        - Assim que recebe a mensagem, o fluxo segue para **organizar os dados**.\n    - **Exemplo real:**\n        - O cliente manda \"Oi\" no WhatsApp → O webhook recebe essa mensagem → O fluxo começa.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -2320,
        1220
      ],
      "id": "77a906dd-a1ee-468e-bf86-047de2b56ad1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "### Nome: `Set - Dados`\n\n- **O que faz?**\n    - Guarda e organiza apenas as informações úteis da mensagem recebida.\n- **Por que existe?**\n    - O Webhook recebe muitos dados, mas nem todos são necessários para o fluxo.\n- **Como funciona?**\n    - Ele cria variáveis organizadas para os próximos passos:\n        - `remoteJid` → Número do cliente.\n        - `fromMe` → Indica se foi o próprio bot que enviou a mensagem.\n        - `conversation` → O conteúdo da mensagem.\n        - `messageType` → Tipo de mensagem (texto, áudio ou imagem).\n        - `time_out` → Tempo limite de espera caso um atendente humano assuma.\n- **O que acontece depois?**\n    - Agora que os dados estão organizados, o fluxo segue para **prevenir mensagens duplicadas**.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1880,
        1220
      ],
      "id": "74eaf2be-09a9-4989-b11c-e1a5fe53b25f",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Nome: `Limitador de Número`\n\n- **O que faz?**\n    - Impede que o mesmo número seja processado várias vezes ao mesmo tempo.\n- **Por que existe?**\n    - Se um cliente mandar muitas mensagens rapidamente, o bot pode acabar respondendo mais de uma vez.\n- **Como funciona?**\n    - Ele verifica se `$json.remoteJid` já está sendo processado.\n- **O que acontece depois?**\n    - Se a mensagem for **única**, o fluxo segue.\n    - Se a mensagem **já está em processamento**, o fluxo **interrompe aqui**.\n- **Exemplo real:**\n    - O cliente manda \"Oi\" e depois \"Tudo bem?\" rapidamente.\n    - Esse filtro impede que o bot processe **as duas mensagens ao mesmo tempo**.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1460,
        1220
      ],
      "id": "5183cd15-7475-4ede-a9a5-d66b156e176e",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "### Nome: `If`\n\n- **O que faz?**\n    - Verifica se a mensagem foi enviada pelo próprio bot.\n- **Por que existe?**\n    - Para evitar que o bot fique respondendo a si mesmo, criando um **loop infinito**.\n- **Como funciona?**\n    - Se `$json.fromMe === true`, significa que a mensagem foi enviada pelo bot e **não deve ser processada**.\n- **O que acontece depois?**\n    - Se a mensagem **foi enviada pelo bot**, o fluxo **interrompe aqui**.\n    - Se foi enviada **por um cliente**, o fluxo **continua** para atualizar o tempo de atendimento.\n- **Exemplo real:**\n    - O bot manda \"Oi\" para o cliente e, sem esse filtro, poderia responder a si mesmo infinitamente.",
        "height": 500,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1180,
        540
      ],
      "id": "e3030509-77f6-47a7-a9f2-a3ebc0283f94",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase`\n\n- **O que faz?**\n    - Atualiza o **tempo limite** que o cliente pode ser atendido automaticamente.\n- **Por que existe?**\n    - Se um atendente humano assumir a conversa, o bot deve **parar de responder** até o tempo limite expirar.\n- **Como funciona?**\n    - Se o cliente interagir, o tempo limite é estendido por **15 minutos**.\n    - Se um humano assumir o atendimento, a automação **pausa** até o tempo expirar.\n- **O que acontece depois?**\n    - Agora o fluxo verifica **se o cliente já está registrado** no banco de dados.\n- **Exemplo real:**\n    - O cliente manda uma mensagem, e o tempo limite é atualizado para que ele possa continuar recebendo respostas automáticas.",
        "height": 500,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -740,
        140
      ],
      "id": "3ea3d0c8-a1b2-4dee-989b-773205267eea",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase - Verificar se o número já existe`\n\n- **O que faz?**\n    - Verifica se o número do cliente já está cadastrado no banco de dados.\n- **Por que existe?**\n    - Se for um **cliente novo**, ele precisa ser **registrado** antes de seguir o atendimento.\n- **Como funciona?**\n    - O nó consulta o Supabase e verifica se já existe um registro para `$json.remoteJid`.\n- **O que acontece depois?**\n    - Se o cliente **já estiver cadastrado**, o fluxo segue para verificar se ele está em atendimento humano.\n    - Se **não estiver cadastrado**, o fluxo cria um novo registro.\n- **Exemplo real:**\n    - Um cliente novo manda \"Oi\" → O bot verifica e percebe que ele **ainda não está no banco** → Cria um cadastro para ele.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -360,
        80
      ],
      "id": "714d80e9-df07-494f-8d9f-fe198d1cf425",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "content": "### Nome: `If - Número Existe?`\n\n- **O que faz?**\n    - Decide se o cliente deve ser **cadastrado no banco** ou se já pode seguir o atendimento.\n- **Por que existe?**\n    - Para garantir que **novos clientes sejam cadastrados corretamente** antes de continuar.\n- **Como funciona?**\n    - Se o resultado da consulta no Supabase estiver **vazio**, significa que o cliente **ainda não foi registrado**.\n- **O que acontece depois?**\n    - Se o cliente **não existir**, ele segue para **cadastrar um novo lead**.\n    - Se o cliente **já existir**, ele segue para verificar se está em atendimento humano.\n- **Exemplo real:**\n    - O cliente João nunca conversou com o bot antes.\n    - Como ele não está no banco, o fluxo segue para cadastrá-lo.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        200,
        -180
      ],
      "id": "b719816a-f2a7-4ba1-b190-d82d5c5a5a69",
      "name": "Sticky Note6"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase - Criar Novo Lead`\n\n- **O que faz?**\n    - Adiciona o novo cliente ao banco de dados.\n- **Por que existe?**\n    - Se um número novo entrar em contato, ele precisa ser registrado para que o bot possa interagir com ele no futuro.\n- **Como funciona?**\n    - Ele cria um novo registro com:\n        - `remoteJid` (número do cliente).\n        - `date_time` (data da primeira interação).\n- **O que acontece depois?**\n    - Agora que o cliente está no banco, ele pode seguir para o atendimento automático.\n- **Exemplo real:**\n    - O cliente João envia \"Oi\" pela primeira vez.\n    - O fluxo cria um novo registro dele no banco de dados.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        520,
        600
      ],
      "id": "0ca95343-2310-4568-b7a4-d87a8f20d0ab",
      "name": "Sticky Note7"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase 2`\n\n- **O que faz?**\n    - Pega o o cliente pode ser atendido automaticamente.\n- **Por que existe?**\n    - Se um atendente humano assumir a conversa, o bot deve **parar de responder** até o tempo limite expirar.\n- **Como funciona?**\n    - Se o cliente interagir, o tempo limite é estendido por **15 minutos**.\n    - Se um humano assumir o atendimento, a automação **pausa** até o tempo expirar.\n- **O que acontece depois?**\n    - Agora o fluxo verifica **se o cliente já está registrado** no banco de dados.\n- **Exemplo real:**\n    - O cliente manda uma mensagem, e o tempo limite é atualizado para que ele possa continuar recebendo respostas automáticas.",
        "height": 500,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -780,
        1700
      ],
      "id": "1e6fda1c-6cc2-4ca3-99bb-b61186914c46",
      "name": "Sticky Note8"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase - Verificar se o número já existe`\n\n- **O que faz?**\n    - Verifica se o número do cliente já está cadastrado no banco de dados.\n- **Por que existe?**\n    - Se for um **cliente novo**, ele precisa ser **registrado** antes de seguir o atendimento.\n- **Como funciona?**\n    - O nó consulta o Supabase e verifica se já existe um registro para `$json.remoteJid`.\n- **O que acontece depois?**\n    - Se o cliente **já estiver cadastrado**, o fluxo segue para verificar se ele está em atendimento humano.\n    - Se **não estiver cadastrado**, o fluxo cria um novo registro.\n- **Exemplo real:**\n    - Um cliente novo manda \"Oi\" → O bot verifica e percebe que ele **ainda não está no banco** → Cria um cadastro para ele.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -380,
        1700
      ],
      "id": "b0086691-6989-4153-a587-e9cfe7d61c1c",
      "name": "Sticky Note9"
    },
    {
      "parameters": {
        "content": "### Nome: `Filter - Está em atendimento manual?`\n\n- **O que faz?**\n    - Verifica se o atendimento já está sendo feito manualmente por um humano.\n- **Por que existe?**\n    - Se um atendente humano estiver falando com o cliente, o bot **deve parar de responder**.\n- **Como funciona?**\n    - Ele consulta o banco de dados e verifica o campo `time_out`:\n        - **Se o tempo de espera ainda estiver ativo**, o bot **não responde**.\n        - **Se o tempo já expirou**, o bot **continua normalmente**.\n- **O que acontece depois?**\n    - Se o cliente **está em atendimento humano**, o fluxo para aqui.\n    - Se o cliente **não está sendo atendido por um humano**, o fluxo continua para processar a mensagem.\n- **Exemplo real:**\n    - Um atendente humano respondeu o cliente há 2 minutos.\n    - O fluxo verifica que o tempo de 15 minutos **ainda não expirou** e **pausa a automaçã**",
        "height": 660,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        80,
        960
      ],
      "id": "156a1d99-cee1-4e03-8952-9cc8ca8244a6",
      "name": "Sticky Note10"
    },
    {
      "parameters": {
        "content": "### Nome: `Supabase - Criar Novo Lead`\n\n- **O que faz?**\n    - Adiciona o novo cliente ao banco de dados.\n- **Por que existe?**\n    - Se um número novo entrar em contato, ele precisa ser registrado para que o bot possa interagir com ele no futuro.\n- **Como funciona?**\n    - Ele cria um novo registro com:\n        - `remoteJid` (número do cliente).\n        - `date_time` (data da primeira interação).\n- **O que acontece depois?**\n    - Agora que o cliente está no banco, ele pode seguir para o atendimento automático.\n- **Exemplo real:**\n    - O cliente João envia \"Oi\" pela primeira vez.\n    - O fluxo cria um novo registro dele no banco de dados.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        80,
        2060
      ],
      "id": "0b542583-e387-4bc0-aba1-a063d481875b",
      "name": "Sticky Note11"
    },
    {
      "parameters": {
        "content": "### Nome: `Switch - Tipo de Mensagem`\n\n- **O que faz?**\n    - Descobre **se a mensagem recebida é texto, áudio ou imagem**.\n- **Por que existe?**\n    - Para que o bot processe **cada tipo de mensagem corretamente**.\n- **Como funciona?**\n    - O nó verifica o `messageType`:\n        - **Se for texto** → Segue para processar mensagens escritas.\n        - **Se for áudio** → Segue para converter áudio em texto.\n        - **Se for imagem** → Segue para interpretar a imagem com IA.\n- **O que acontece depois?**\n    - Cada tipo de mensagem segue um caminho diferente no fluxo.\n- **Exemplo real:**\n    - O cliente manda um áudio → O fluxo detecta e **envia o áudio para transcrição**.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        480,
        1740
      ],
      "id": "a0f9970d-1494-4096-b5ce-a3a1c5315567",
      "name": "Sticky Note12"
    },
    {
      "parameters": {
        "content": "### Nome: `Base64 Audio` e `Base64 to Audio`\n\n- **O que fazem?**\n    - Convertem o **áudio recebido** do WhatsApp de Base64 para um arquivo de áudio `.ogg`.\n- **Por que existem?**\n    - O WhatsApp envia áudios no formato Base64, que precisa ser convertido antes de ser analisado.\n- **Como funcionam?**\n    - Eles pegam o áudio codificado e transformam em um **arquivo físico** que pode ser processado.\n- **O que acontece depois?**\n    - O áudio convertido é enviado para o **OpenAI Whisper**, que faz a transcrição para texto.\n- **Exemplo real:**\n    - O cliente envia um áudio perguntando \"Quais são os planos disponíveis?\".\n    - Esse áudio é convertido e enviado para a IA transcrever.",
        "height": 440,
        "width": 620,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1300,
        1980
      ],
      "id": "b114a5b8-e90f-4dd2-b8c6-f264cd62b496",
      "name": "Sticky Note13"
    },
    {
      "parameters": {
        "content": "### Nome: `Base64 Image` e `Base64 to Image`\n\n- **O que fazem?**\n    - Convertem **imagens enviadas** do WhatsApp de Base64 para arquivos `.jpeg`.\n- **Por que existem?**\n    - O WhatsApp envia imagens como código Base64, e precisamos converter para analisá-las.\n- **Como funcionam?**\n    - Pegam a imagem codificada e geram um **arquivo físico** para que possa ser interpretado.\n- **O que acontece depois?**\n    - A imagem convertida é enviada para a IA descrever seu conteúdo.\n- **Exemplo real:**\n    - O cliente envia a foto de um contrato.\n    - A imagem é convertida para `.jpeg`, permitindo que o bot interprete seu conteúdo.",
        "height": 400,
        "width": 620,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1300,
        2720
      ],
      "id": "e0953e63-07f3-4f0e-9d77-e6ee93060224",
      "name": "Sticky Note14"
    },
    {
      "parameters": {
        "content": "## Pega mensagem e salva no banco de memória \n",
        "height": 80,
        "width": 620,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1280,
        1480
      ],
      "id": "ae4e32d6-10e7-4390-a2e9-dd93ce395ef2",
      "name": "Sticky Note15"
    },
    {
      "parameters": {
        "content": "### Nome: `Memória de Texto`\n\n- **O que faz?**\n    - Armazena mensagens de texto recebidas para referência futura.\n- **Por que existe?**\n    - Para que o bot possa lembrar do que o cliente já disse e usar essa informação nas próximas respostas.\n- **Como funciona?**\n    - Ele salva a mensagem no banco de dados Redis.\n- **O que acontece depois?**\n    - O fluxo continua para combinar essa mensagem com outras interações anteriores.\n- **Exemplo real:**\n    - O cliente envia \"Oi, quero um orçamento\".\n    - O bot salva essa mensagem para analisar depois.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        2420,
        960
      ],
      "id": "be8003bc-cd9c-4f2a-9e8a-b89ac52a8bcb",
      "name": "Sticky Note16"
    },
    {
      "parameters": {
        "content": "### Nome: `Delay - Espera do Usuário`\n\n- **O que faz?**\n    - Aguarda alguns segundos antes de continuar o fluxo.\n- **Por que existe?**\n    - Muitas pessoas enviam mensagens em partes, como \"Oi\" → \"Tudo bem?\" → \"Quero um orçamento\".\n    - Esse delay permite esperar **caso o usuário ainda esteja digitando**.\n- **Como funciona?**\n    - O tempo de espera pode ser ajustado (padrão: **5 segundos**).\n- **O que acontece depois?**\n    - Se o usuário mandar outra mensagem nesse intervalo, o fluxo adiciona essa nova mensagem à memória.\n- **Exemplo real:**\n    - O cliente envia \"Oi\" e depois \"Quero um orçamento\".\n    - O bot aguarda 5 segundos para evitar responder antes da mensagem final.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        2860,
        940
      ],
      "id": "7cf7215b-7660-4f9c-a12f-f4566a838f67",
      "name": "Sticky Note17"
    },
    {
      "parameters": {
        "content": "## **Redis - Recuperando Memória da Conversa**\n\n### **Nome do Nó:** `Redis - Recuperar Memória`\n\n- **O que faz?**\n    - Busca **as mensagens anteriores do cliente** armazenadas no banco de dados Redis.\n- **Por que existe?**\n    - Para permitir que o bot **lembre do que foi falado antes**, tornando as respostas mais naturais.\n- **Como funciona?**\n    - O nó acessa o banco de dados Redis e recupera **as últimas mensagens enviadas pelo cliente**.\n- **O que acontece depois?**\n    - A conversa recuperada é enviada para o nó de **processamento da IA**.",
        "height": 540,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3280,
        920
      ],
      "id": "736a829e-32ee-43c8-a824-a2b29f0de5cf",
      "name": "Sticky Note18"
    },
    {
      "parameters": {
        "content": "### Nome: `Verificar Combinação`\n\n- **O que faz?**\n    - Compara as duas últimas mensagens armazenadas para ver se são **iguais ou diferentes**.\n- **Por que existe?**\n    - Para garantir que o bot só responda quando o usuário **terminar de escrever**.\n- **Como funciona?**\n    - Se a **mensagem 1 e a mensagem 2 forem iguais**, significa que o usuário **parou de escrever** e o bot pode responder.\n    - Se forem **diferentes**, significa que o usuário **ainda está digitando**, e o fluxo aguarda mais tempo.\n- **O que acontece depois?**\n    - Se a verificação for **positiva**, o fluxo segue para a IA criar a resposta.\n    - Se for **negativa**, o fluxo volta para o delay para esperar mais tempo.\n- **Exemplo real:**\n    - O cliente manda \"Oi\".\n    - O bot espera, mas o cliente adiciona \"Quero um orçamento\".\n    - O fluxo percebe que a mensagem mudou e espera mais um pouco antes de responder.",
        "height": 640,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3680,
        820
      ],
      "id": "2e38fd20-c969-448d-ac6a-555d96792495",
      "name": "Sticky Note19"
    },
    {
      "parameters": {
        "content": "## **Code - Organizando a Resposta da IA**\n\n### **Nome do Nó:** `Code - Formatar Resposta`\n\n- **O que faz?**\n    - Processa o texto gerado pela IA para garantir que ele **esteja bem formatado** antes de ser enviado.\n- **Por que existe?**\n    - Para evitar erros de formatação e garantir que a resposta seja **clara e fácil de ler**.\n- **Como funciona?**\n    - O código ajusta:\n        - ✅ **Quebras de linha** no texto.\n        - ✅ **Correções gramaticais**.\n        - ✅ **Separa mensagens muito longas** para serem enviadas uma de cada vez.\n- **O que acontece depois?**\n    - O texto formatado segue para **o envio ao cliente via WhatsApp**.",
        "height": 560,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        4100,
        700
      ],
      "id": "0b5aff69-879d-4916-bbcf-0486b23dfb66",
      "name": "Sticky Note20"
    },
    {
      "parameters": {
        "content": "## **Organizar Dias - Estruturando as Datas**\n\n### **Nome do Nó:** `Organizar Dias`\n\n- **O que faz?**\n    - Gera uma lista organizada com os **próximos 10 dias**, incluindo o nome do dia da semana.\n- **Por que existe?**\n    - Para fornecer um formato padronizado de datas, garantindo que os próximos nós trabalhem corretamente com os dias disponíveis.\n- **Como funciona?**\n    - O nó cria uma lista de **datas formatadas**, facilitando a busca por horários disponíveis.\n- **Exemplo de saída:**\n    \n    ```\n    swift\n    CopyEdit\n    Segunda-feira, 04/03/2025\n    Terça-feira, 05/03/2025\n    Quarta-feira, 06/03/2025\n    \n    ```\n    \n- **O que acontece depois?**\n    - Os dados seguem para o nó **Filter**, onde serão analisados.\n",
        "height": 720,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        4540,
        540
      ],
      "id": "bffbc5c3-c4cf-47a9-91da-98cbb1418399",
      "name": "Sticky Note21"
    },
    {
      "parameters": {
        "content": "## **Filter - Filtrando as Informações Relevantes**\n\n### **Nome do Nó:** `Filter`\n\n- **O que faz?**\n    - Decide se os dados devem ou não ser processados.\n- **Por que existe?**\n    - Para evitar que mensagens irrelevantes entrem no fluxo e ocupem processamento desnecessário.\n- **Como funciona?**\n    - O nó verifica **se a mensagem contém informações necessárias para o fluxo continuar**.\n- **O que acontece depois?**\n    - Se os dados forem válidos, eles seguem para o nó **SDR.IA**.",
        "height": 480,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        4960,
        780
      ],
      "id": "05b298b6-3d18-4803-b8b1-098d3e240469",
      "name": "Sticky Note22"
    },
    {
      "parameters": {
        "content": "## **dia_semana - Descobrindo o Dia da Semana**\n\n### **Nome do Nó:** `dia_semana`\n\n- **O que faz?**\n    - Converte uma data fornecida pelo cliente no **nome do dia da semana correspondente**.\n- **Por que existe?**\n    - Para garantir que a IA trabalhe com **informações mais precisas**, reconhecendo corretamente o dia da solicitação.\n- **Como funciona?**\n    - O nó recebe uma data no formato **dd/mm/yyyy** e retorna o nome do dia da semana.\n- **Exemplo de saída:**\n    \n    ```\n    makefile\n    CopyEdit\n    Entrada: 06/03/2025\n    Saída: Quinta-feira\n    \n    ```\n    \n- **O que acontece depois?**\n    - A informação segue para outros nós que precisam validar **disponibilidade ou reagendar eventos**.",
        "height": 740,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5360,
        -360
      ],
      "id": "baab9061-ca24-4b4e-8609-9c4bc0b004fd",
      "name": "Sticky Note23"
    },
    {
      "parameters": {
        "content": "## **cancelamento - Processando um Pedido de Cancelamento**\n\n### **Nome do Nó:** `cancelamento`\n\n- **O que faz?**\n    - Garante que o cancelamento de um agendamento seja registrado corretamente.\n- **Por que existe?**\n    - Para evitar que o cliente tenha compromissos agendados sem necessidade.\n- **Como funciona?**\n    - O nó recebe os seguintes dados:\n        - **Nome do cliente**\n        - **E-mail**\n        - **Data do agendamento**\n    - Ele então registra o cancelamento na base de dados.\n- **O que acontece depois?**\n    - O cliente recebe uma confirmação do cancelamento.",
        "height": 600,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5740,
        -220
      ],
      "id": "51dc1bf7-9188-4069-b271-025853ee4246",
      "name": "Sticky Note24"
    },
    {
      "parameters": {
        "content": "## **reagendamento - Reagendando um Horário**\n\n### **Nome do Nó:** `reagendamento`\n\n- **O que faz?**\n    - Permite que o cliente **mude a data e horário de um compromisso já agendado**.\n- **Por que existe?**\n    - Para evitar que clientes precisem cancelar e agendar novamente manualmente.\n- **Como funciona?**\n    - O nó verifica a **disponibilidade de horários**, sugere novas datas e altera o compromisso no sistema.\n- **O que acontece depois?**\n    - O cliente recebe **novas opções de horários** para escolher.",
        "height": 500,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6120,
        -120
      ],
      "id": "916adbe5-71ab-4d36-8e56-39c611cd3750",
      "name": "Sticky Note25"
    },
    {
      "parameters": {
        "content": "## **agendamento - Criando um Novo Agendamento**\n\n### **Nome do Nó:** `agendamento`\n\n- **O que faz?**\n    - Registra um **novo agendamento** no sistema.\n- **Por que existe?**\n    - Para permitir que clientes marquem reuniões de forma automatizada.\n- **Como funciona?**\n    - O nó solicita os seguintes dados:\n        - **Nome do cliente**\n        - **E-mail**\n        - **Data e horário desejado**\n    - Ele então verifica a disponibilidade e confirma o agendamento.\n- **O que acontece depois?**\n    - O cliente recebe **uma confirmação do agendamento** via WhatsApp ou e-mail.",
        "height": 540,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5380,
        1300
      ],
      "id": "f58443a8-79b6-4503-a827-7471556b6705",
      "name": "Sticky Note26"
    },
    {
      "parameters": {
        "content": "## **Calculator - Processando Cálculos**\n\n### **Nome do Nó:** `Calculator`\n\n- **O que faz?**\n    - Realiza cálculos numéricos caso necessário, como **diferença entre datas e horários**.\n- **Por que existe?**\n    - Para auxiliar na **verificação de tempos entre eventos e reagendamentos**.\n- **O que acontece depois?**\n    - Os dados calculados são usados para definir horários de atendimento.",
        "height": 400,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6140,
        1300
      ],
      "id": "9d4c9ccb-c049-4004-a193-27e4c830e0dc",
      "name": "Sticky Note28"
    },
    {
      "parameters": {
        "content": "## **disponibilidade - Conferindo Horários Livres**\n\n### **Nome do Nó:** `disponibilidade`\n\n- **O que faz?**\n    - Busca **horários disponíveis na agenda** antes de sugerir um novo compromisso.\n- **Por que existe?**\n    - Para garantir que **nenhum agendamento entre em conflito com outro compromisso**.\n- **Como funciona?**\n    - O nó verifica os horários disponíveis entre **09:00 e 18:00** e retorna **duas opções por dia** para os próximos três dias.\n- **O que acontece depois?**\n    - Os horários sugeridos são enviados ao cliente para escolha.",
        "height": 540,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5760,
        1300
      ],
      "id": "e911fcb4-8af7-483d-91ee-41bbd87aeb2f",
      "name": "Sticky Note29"
    },
    {
      "parameters": {
        "content": "## **Postgres Chat Memory - Memória da Conversa**\n\n### **Nome do Nó:** `Postgres Chat Memory`\n\n- **O que faz?**\n    - Mantém um **registro da conversa do cliente** para futuras interações.\n- **Por que existe?**\n    - Para que o bot **lembre do que foi falado anteriormente**, tornando as respostas mais inteligentes.\n- **O que acontece depois?**\n    - Quando o cliente volta a interagir, o bot recupera o histórico e responde de forma mais precisa.",
        "height": 420,
        "width": 340,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6500,
        620
      ],
      "id": "05d790ad-89b0-494a-b49e-a3e9b9b6eceb",
      "name": "Sticky Note30"
    },
    {
      "parameters": {
        "content": "### `Loop Over Items`\n\n- **O que faz?**\n    - Envia **cada parte da mensagem separadamente**.\n- **Por que existe?**\n    - Para garantir que todas as partes da mensagem sejam enviadas de forma **sequencial e organizada**.\n- **Como funciona?**\n    - O loop percorre todas as partes da mensagem e envia uma de cada vez.\n- **O que acontece depois?**\n    - Agora cada parte da resposta será enviada para o WhatsApp de forma natural.\n- **Exemplo real:**\n    - A IA gerou uma resposta com **3 parágrafos**.\n    - O bot envia o **primeiro parágrafo**, depois o **segundo**, depois o **terceiro**.",
        "height": 480,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5080,
        2100
      ],
      "id": "9ae1009e-e8a6-4299-97ba-25a022fd20bb",
      "name": "Sticky Note31"
    },
    {
      "parameters": {
        "content": "## **Redis - Gerenciando Memória da Conversa**\n\n### **Nome do Nó:** `Redis6`\n\n- **O que faz?**\n    - Deleta registros antigos da memória de conversação.\n- **Por que existe?**\n    - Para garantir que **dados desnecessários não fiquem ocupando espaço**, evitando conflitos em novas interações.\n- **Como funciona?**\n    - Ele remove **dados de cache do Redis**, apagando registros antigos que não são mais necessários para a conversa.\n- **O que acontece depois?**\n    - O fluxo segue para os próximos nós, agora sem informações desatualizadas na memória.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6900,
        1020
      ],
      "id": "ff070597-ae89-41df-b2ab-3b0495896cd3",
      "name": "Sticky Note32"
    },
    {
      "parameters": {
        "content": "## **Edit Fields6 - Organizando Dados**\n\n### **Nome do Nó:** `Edit Fields6`\n\n- **O que faz?**\n    - Ajusta e armazena as informações relevantes antes de serem processadas pelos próximos nós.\n- **Por que existe?**\n    - Para garantir que **os dados estejam no formato correto** antes de serem utilizados.\n- **Como funciona?**\n    - Ele filtra e reestrutura os dados, deixando apenas as informações importantes para os próximos passos do fluxo.\n- **O que acontece depois?**\n    - Os dados seguem para o nó **Split Out2**, que divide as informações para diferentes partes do fluxo.",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6900,
        1640
      ],
      "id": "6b56d3e1-3d7f-4f92-a77a-3475950902d2",
      "name": "Sticky Note33"
    },
    {
      "parameters": {
        "content": "## **Split Out2 - Dividindo as Informações**\n\n### **Nome do Nó:** `Split Out2`\n\n- **O que faz?**\n    - Separa os dados processados em múltiplos caminhos, direcionando cada tipo de informação para o nó correto.\n- **Por que existe?**\n    - Para garantir que **cada informação seja enviada para o local apropriado**, evitando erros no processamento.\n- **Como funciona?**\n    - Ele verifica as informações armazenadas e as **envia separadamente para os próximos nós**.\n- **O que acontece depois?**\n    - Cada informação segue para o nó correspondente, dependendo da ação necessária (agendamento, cancelamento, etc.).",
        "height": 540,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7280,
        1640
      ],
      "id": "2f310bf7-2bb4-47a1-b4eb-c35d53de0363",
      "name": "Sticky Note34"
    },
    {
      "parameters": {
        "content": "### **Nome do Nó:** `Code`\n\n- **O que faz?**\n    - Verifica se uma mensagem recebida contém um **link do Google Meet** com um **indicador de agendamento**.\n- **Por que existe?**\n    - Para **identificar reuniões agendadas automaticamente** e permitir que o fluxo reaja de forma adequada.\n- **Como funciona?**\n    - O código faz as seguintes verificações:\n        1. **Obtém o conteúdo da mensagem**, verificando diferentes formatos possíveis (`message`, `message.text`, `message.content`, etc.).\n        2. **Procura por um link do Google Meet** (`meet.google.com`).\n        3. **Verifica se há um identificador de agendamento** (`?hs=`, `&hs=` ou um código de data e hora no formato `YYYYMMDDTHHMM`).\n        4. **Adiciona um campo `isMeetSchedule`** à mensagem para indicar se um link de reunião foi encontrado.",
        "height": 580,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5780,
        2220
      ],
      "id": "efa97d9d-a6ed-4f45-8d5b-0ebdbefcadc1",
      "name": "Sticky Note35"
    },
    {
      "parameters": {
        "content": "### **Número Aleatório - Criando um Valor Aleatório**\n\n### **Nome do Nó:** `Número Aleatório`\n\n- **O que faz?**\n    - Gera um número aleatório entre 1 e 4 para definir como a mensagem será enviada, se será por audio ou texto. Se cair: 1,2 ou 3 será texto e se cair 4 será áudio.\n- **Por que existe?**\n    - Para criar variações no fluxo e permitir diferentes tipos de respostas\n        \n- **O que acontece depois?**\n    - O fluxo segue para o nó **Switch**, onde será decidido o tipo de mensagem a ser enviada.",
        "height": 460,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6260,
        3100
      ],
      "id": "a6fcad6e-2b1e-4646-af24-de5adac60380",
      "name": "Sticky Note36"
    },
    {
      "parameters": {
        "content": "### **Switch - Decidindo o Tipo de Mensagem**\n\n### **Nome do Nó:** `Switch`\n\n- **O que faz?**\n    - Decide **se a mensagem deve ser enviada como texto ou áudio**.\n- **Por que existe?**\n    - Para garantir que cada mensagem seja tratada corretamente, **dependendo do formato escolhido**.\n- **Como funciona?**\n    - Ele verifica o valor do **número aleatório gerado**:\n        - **1 ou 2 → Envia texto**\n        - **3 ou 4 → Envia áudio**\n- **O que acontece depois?**\n    - Se for **texto**, segue para **Contabilizar Cfor **áudio**, segue para **Eleven Labs**.",
        "height": 460,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6780,
        3100
      ],
      "id": "fb3f4adf-342d-4aa3-b08a-dfb463d4a1cb",
      "name": "Sticky Note37"
    },
    {
      "parameters": {
        "content": "### **Contabilizar Caracteres - Analisando o Texto**\n\n### **Nome do Nó:** `Contabilizar Caracteres`\n\n- **O que faz?**\n    - Conta quantos caracteres tem a mensagem antes do envio para dar aquela sensação de digitando..\n- **Por que existe?**\n    - Para evitar que **mensagens muito longas sejam enviadas de uma só vez**, quebrando-as se necessário.\n- **Como funciona?**\n    - O nó verifica **o número total de caracteres** na mensagem .\n- **O que acontece depois?**\n    - Se o tamanho for aceitável, a mensagem segue para **Envio de Text Enviar Texto - Enviando a Mensagem**",
        "height": 520,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7320,
        3100
      ],
      "id": "4e571556-f784-4ea2-b2e8-1af402e6d1fd",
      "name": "Sticky Note38"
    },
    {
      "parameters": {
        "content": "### **Nome do Nó:** `Enviar Texto`\n\n- **O que faz?**\n    - Envia a mensagem de texto para o usuário via **API externa**.\n- **Por que existe?**\n    - Para garantir que a mensagem seja entregue corretamente ao usuário.\n- **Como funciona?**\n    - O nó faz uma **requisição POST** para um endpoint externo .\n- **O que acontece depois?**\n    - O cliente recebe a mensagem no WhatsApp.",
        "height": 340,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7760,
        3100
      ],
      "id": "c836a1ad-f1ab-4719-a045-cdc92c6cb663",
      "name": "Sticky Note39"
    },
    {
      "parameters": {
        "content": "### Eleven Labs - Convertendo T **Nome do Nó:** `Eleven Labs`\n\n- **O que faz?**\n    - Converte a mensagem de texto em um **arquivo de áudio** usando IA.\n- **Por que existe?**\n    - Para permitir que a resposta seja enviada **em formato de áudio** .\n- **Como funciona?**\n    - O nó envia o texto para a API da **Eleven Labs**, que **gera um arquivo de áudio baseado no texto**.\n- *O que ac O áudio segue para **Extract from File**.",
        "height": 360,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5740,
        4040
      ],
      "id": "7c6541e3-e044-441e-8ee6-d62b8a39cdff",
      "name": "Sticky Note40"
    },
    {
      "parameters": {
        "content": "### **Extract from File - Convertendo para Base64**\n\n### **Nome do Nó:** `Extract from File`\n\n- **O que faz?**\n    - Converte o arquivo de áudio gerado pela IA para um formato que possa ser enviado via API.\n- **Por que existe?**\n    - Alguns sistemas aceitam apenas áudios em **Base64**, então esse nó garante a conversão correta .\n- **Como funciona?**\n    - Ele transforma o **arquivo de áudio** em uma **string Base64**.\n- **O que acontece depois?**\n    - O áudio formatado é enviado",
        "height": 460,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6140,
        4040
      ],
      "id": "151adcb8-ea84-4070-941a-c1bf8832aed6",
      "name": "Sticky Note41"
    },
    {
      "parameters": {
        "content": "### **Enviar Áudio - Enviando a Resposta**\n\n### **Nome do Nó:** `Enviar Áudio`\n\n- **O que faz?**\n    - Envia o **arquivo de áudio** para o usuário via **API externa**.\n- **Por que existe?**\n    - Para que mensagens possam ser enviadas como **áudio, e não apenas texto** .\n- **Como funciona?**\n    - O nó faz uma **requisição POST** para um endpoint externo.\n- **O que acontece depois?**\n    - O cliente recebe **a mensagem de áudio diretamente no WhatsApo garante **envio eficiente de mensagens de texto e áudio**, tornando o atendimento **mais dinâmico e inteligente**.",
        "height": 480,
        "width": 340,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        6540,
        4040
      ],
      "id": "c2187fc1-6df9-4a8f-a0d6-333ec53953e7",
      "name": "Sticky Note42"
    },
    {
      "parameters": {
        "content": "## IMPORTANTE\n**Caso você não queira utilizar respostas em áudio, você só precisa desativar o fluxo que leva até o eleven labs**\n"
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5840,
        3640
      ],
      "typeVersion": 1,
      "id": "e5bd0e15-f9e2-426b-bcfc-9f7a6d086f6d",
      "name": "Sticky Note43"
    },
    {
      "parameters": {
        "content": "## IMPORTANTE\n**Não mexa nas variáveis que não falamos na aula, isso pode gerar erros no fluxo**\n"
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2280,
        680
      ],
      "typeVersion": 1,
      "id": "52739cdd-d8ff-4f3e-a011-725bf832c99f",
      "name": "Sticky Note44"
    },
    {
      "parameters": {
        "content": "## ERRO NO FLUXO\n**Identifique os erros a partir dos nodes VERMELHOS**\n",
        "height": 120
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2280,
        860
      ],
      "typeVersion": 1,
      "id": "6598a427-0964-4330-a14f-f44a3c9a5e64",
      "name": "Sticky Note45"
    },
    {
      "parameters": {
        "content": "![Source example](https://quez-ia.com/wp-content/uploads/2025/02/img2-1024x856.webp)",
        "height": 520,
        "width": 580
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -3060,
        1240
      ],
      "id": "2d010003-3198-4690-a0a9-83ec2a437b07",
      "name": "Sticky Note46"
    },
    {
      "parameters": {
        "operation": "get",
        "key": "={{ $('Dados').item.json.remoteJid }}",
        "options": {
          "dotNotation": false
        }
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        2960,
        1760
      ],
      "id": "e649b0fb-6890-4f8b-af15-e526a460af84",
      "name": "memory"
    },
    {
      "parameters": {
        "operation": "get",
        "key": "={{ $('Dados').item.json.remoteJid }}",
        "options": {
          "dotNotation": false
        }
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        3580,
        1760
      ],
      "id": "0947fcf8-1518-4b03-bf6c-9c7fab15b2bc",
      "name": "memory2"
    },
    {
      "parameters": {
        "jsCode": "// Obtém a saída do nó \"SDR.IA\"\nconst output = $('SDR.IA').item?.json?.output || '';\n\n// Expressão regular para dividir o texto em frases, mantendo perguntas e períodos completos\nconst splitOutput = output.split(/(?<=[?.!])\\s+(?=[A-Z])/g);\n\n// Formatar e limpar os blocos\nconst formattedOutput = splitOutput.map(part => part.trim()).filter(part => part);\n\n// Retornar cada frase como um item separado para o n8n processar corretamente\nreturn formattedOutput.map(part => ({ json: { result: part } }));\n"
      },
      "id": "38ec727c-ce3b-41c4-99e4-8332fa91ba7e",
      "name": "Code3",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        6660,
        1760
      ]
    },
    {
      "parameters": {
        "content": "## COMECE AQUI\n**Opa, tudo bem? Quézia Demetrio por aqui...É o seguinte: Esse modelo pode ser sempre atualizado por mim. Porém, no final das contas, você sempre vai mudar as mesmas variáveis. Caso eu mude algo no fluxo, será um código, uma otimização para que funcione melhor...A ideia é te entregar sempre a melhor versão.**\n",
        "width": 520,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3060,
        1060
      ],
      "typeVersion": 1,
      "id": "8aedd89c-32fd-4e9c-907c-c47d21ff8b1b",
      "name": "Sticky Note47"
    }
  ],
  "pinData": {},
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Dados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Supabase",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "SDR.IA",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Base64 to Audio": {
      "main": [
        [
          {
            "node": "Transcreve Áudio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Base64 to Image": {
      "main": [
        [
          {
            "node": "Analisa a Imagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase": {
      "main": [
        [
          {
            "node": "Number exist?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase2": {
      "main": [
        [
          {
            "node": "Number exist?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Number exist?": {
      "main": [
        [
          {
            "node": "In manual service?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase3": {
      "main": [
        [
          {
            "node": "Tipo de Mensagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "In manual service?": {
      "main": [
        [
          {
            "node": "Tipo de Mensagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Base64 Audio": {
      "main": [
        [
          {
            "node": "Base64 to Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Base64 Image": {
      "main": [
        [
          {
            "node": "Base64 to Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Redis6",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Number exist?1": {
      "main": [
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delay": {
      "main": [
        [
          {
            "node": "memory2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Memória de Texto": {
      "main": [
        [
          {
            "node": "memory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Memória de Áudio": {
      "main": [
        [
          {
            "node": "memory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Memória de Imagem": {
      "main": [
        [
          {
            "node": "memory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tipo de Mensagem": {
      "main": [
        [
          {
            "node": "Memória de Texto",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Base64 Audio",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Base64 Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limitador de Número": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dados": {
      "main": [
        [
          {
            "node": "Limitador de Número",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Contabilizar Caracteres": {
      "main": [
        [
          {
            "node": "Enviar Texto",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enviar Texto": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcreve Áudio": {
      "main": [
        [
          {
            "node": "Memória de Áudio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analisa a Imagem": {
      "main": [
        [
          {
            "node": "Memória de Imagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Contabilizar Caracteres",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Contabilizar Caracteres",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Contabilizar Caracteres",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Eleven Labs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Eleven Labs": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Enviar Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Número Aleatório": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enviar Audio": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Organizar Dias": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "agendamento": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "reagendamento": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "SDR.IA": {
      "main": [
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "Contabilizar Caracteres",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Número Aleatório",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redis6": {
      "main": [
        []
      ]
    },
    "dia_semana": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Calculator": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "disponibilidade": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Code1": {
      "main": [
        [
          {
            "node": "Organizar Dias",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cancelamento": {
      "ai_tool": [
        [
          {
            "node": "SDR.IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "memory": {
      "main": [
        [
          {
            "node": "Delay",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "memory2": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "486f72a0-623a-4aa1-8cc9-a390e27b9b82",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "08f792c88d6c17a03adaef9e98c81858795697599d5d63dc53224d9c2a9c8495"
  },
  "id": "4bmaURo9kziO5T51",
  "tags": [
    {
      "createdAt": "2025-02-27T14:32:00.502Z",
      "updatedAt": "2025-02-27T14:32:00.502Z",
      "id": "lNJKOuYv4fLbGyVn",
      "name": "SDR"
    },
    {
      "createdAt": "2025-03-04T23:05:56.489Z",
      "updatedAt": "2025-03-04T23:05:56.489Z",
      "id": "X52HFqgYWCv9u0G3",
      "name": "GOOGLE AGENDA"
    },
    {
      "createdAt": "2025-03-04T23:06:02.446Z",
      "updatedAt": "2025-03-04T23:06:02.446Z",
      "id": "cf5OqMcaZ9Gf4emG",
      "name": "QUEZIADEMETRIO"
    }
  ]
}