AutomationFlowsAI & RAG › Clinicaintegral Secretary

Clinicaintegral Secretary

CLINICAINTEGRAL_secretary. Uses postgres, mcpClientTool, googleDriveTool, toolWorkflow. Webhook trigger; 89 nodes.

Webhook trigger★★★★★ complexityAI-powered89 nodesPostgresMcp Client ToolGoogle Drive ToolTool WorkflowAgentHTTP RequestChain LlmTelegram Tool
AI & RAG Trigger: Webhook Nodes: 89 Complexity: ★★★★★ AI nodes: yes Added:
Clinicaintegral Secretary — n8n workflow card showing Postgres, Mcp Client Tool, Google Drive Tool integration

This workflow follows the Agent → Chainllm recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "CLINICAINTEGRAL_secretary",
  "nodes": [
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "8ca54eae-15d1-49d3-af33-7a6e5d17b833",
              "leftValue": "={{ $json.tipo }}",
              "rightValue": "incoming",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            },
            {
              "id": "82912d66-ee4b-439c-9d55-96090bc6ba62",
              "leftValue": "={{ $json.etiquetas }}",
              "rightValue": "agente",
              "operator": {
                "type": "array",
                "operation": "notContains",
                "rightType": "any"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        2800,
        752
      ],
      "id": "d1c8e5c4-56ed-4825-a587-09bfe5c27b1a",
      "name": "Mensagem chegando?"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "clinicaintegral-0e95de7a4793",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        2240,
        752
      ],
      "id": "e63d9c25-1dd5-4e77-a762-d6405b7e58cc",
      "name": "Mensagem recebida"
    },
    {
      "parameters": {
        "jsCode": "const ultima_mensagem_da_fila = $input.last()\nconst mensagem_do_workflow = $('Info').first()\n\nif (ultima_mensagem_da_fila.json.id_mensagem !== mensagem_do_workflow.json.id_mensagem) {\n  // Mensagem encavalada, para o workflow\n  return [];\n}\n\n// Pass-through da fila de mensagens\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        3984,
        752
      ],
      "id": "08f0e8a0-6d2b-43b6-aa69-aad10c77c258",
      "name": "Mensagem encavalada?"
    },
    {
      "parameters": {
        "operation": "select",
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "public"
        },
        "table": {
          "__rl": true,
          "value": "n8n_fila_mensagens_clinica",
          "mode": "list",
          "cachedResultName": "n8n_fila_mensagens_clinica"
        },
        "returnAll": true,
        "where": {
          "values": [
            {
              "column": "telefone",
              "value": "={{ $('Info').item.json.telefone }}"
            }
          ]
        },
        "sort": {
          "values": [
            {
              "column": "timestamp"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        3760,
        752
      ],
      "id": "34817c2b-092a-4f62-a572-d391955a18e4",
      "name": "Buscar mensagens",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "deleteTable",
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "public"
        },
        "table": {
          "__rl": true,
          "value": "n8n_historico_mensagens_clinica",
          "mode": "list",
          "cachedResultName": "n8n_historico_mensagens_clinica"
        },
        "deleteCommand": "delete",
        "where": {
          "values": [
            {
              "column": "session_id",
              "value": "={{ $json.telefone }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        4192,
        752
      ],
      "id": "85761fea-38af-48f3-9bd7-ac1b24363369",
      "name": "Limpar fila de mensagens",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "# Processando mensagens encavaladas\n\nEssa etapa trata a situa\u00e7\u00e3o em que o usu\u00e1rio envia m\u00faltiplas mensagens seguidas. O ponto negativo \u00e9 o aumento no tempo de resposta do agente. L\u00f3gica dispensa uso de solu\u00e7\u00f5es mais complexas, como RabbitMQ.\n\nTempo de espera recomendado de ~16s. Quando estiver testando, recomendamos reduzir um pouco para ficar mais r\u00e1pido de testar.\n",
        "height": 540,
        "width": 1080,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3248,
        560
      ],
      "id": "c18246d8-ccd2-48ab-83e3-9b4e9204f80e",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "amount": 3
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        3552,
        752
      ],
      "id": "5f5d24c9-e380-4f18-bd62-05a3b0a2a6a9",
      "name": "Esperar"
    },
    {
      "parameters": {
        "content": "# Gerando resposta",
        "height": 540,
        "width": 2080,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5024,
        560
      ],
      "id": "2f947b77-6824-43f6-a80a-0d4721cbdb3a",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "# Enviando resposta",
        "height": 540,
        "width": 1200,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7152,
        560
      ],
      "id": "a077ebd7-1b58-4e38-866a-cb62157475b2",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "# Tratando input\n",
        "height": 540,
        "width": 1060
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        2160,
        560
      ],
      "id": "a2172795-3bf2-4ab8-8809-305986ec2bc8",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $('Info').item.json.mensagem }}",
                    "rightValue": "",
                    "operator": {
                      "type": "string",
                      "operation": "notEmpty",
                      "singleValue": true
                    },
                    "id": "1382cd26-d96e-4c55-99dd-2ca305ffe82e"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Texto"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "b9a7e16f-b6e4-45d7-846d-92dcb3117593",
                    "leftValue": "={{ $('Info').item.json.mensagem_de_audio }}",
                    "rightValue": "",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "\u00c1udio"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        3088,
        752
      ],
      "id": "e39e07c9-cafc-4b23-a447-887be420272c",
      "name": "Tipo de mensagem"
    },
    {
      "parameters": {
        "content": "# Processando \u00e1udio",
        "height": 420,
        "width": 1080,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3248,
        1120
      ],
      "id": "348b912b-3f5a-48c1-9009-9d68f85d3b13",
      "name": "Sticky Note6"
    },
    {
      "parameters": {
        "content": "Para testar, recomendamos criar uma tag \"testando-agente\" e usar no n\u00famero que enviar\u00e1 as mensagens para a secret\u00e1ria durante os testes.\n\nVoc\u00ea pode marcar o seu n\u00famero no Chatwoot com essa tag para que o agente responda apenas voc\u00ea.\n\nDepois de testar e validar, s\u00f3 remover a regra do filtro pro seu agente responder todo mundo.\n\n",
        "height": 180,
        "width": 600,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        2608,
        912
      ],
      "id": "a6dd7400-24a7-4a70-8b16-f96743940995",
      "name": "Sticky Note8"
    },
    {
      "parameters": {
        "sseEndpoint": "https://editor.b7g.app/mcp/clinica-calendar/sse",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "typeVersion": 1,
      "position": [
        5632,
        960
      ],
      "id": "ecb0f990-abe0-4ff8-9632-944e600870d9",
      "name": "MCP Google Calendar"
    },
    {
      "parameters": {
        "resource": "fileFolder",
        "returnAll": true,
        "filter": {
          "folderId": {
            "__rl": true,
            "value": "",
            "mode": "list"
          }
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDriveTool",
      "typeVersion": 3,
      "position": [
        5760,
        960
      ],
      "id": "d1971d7f-44f6-41e2-ab2b-308e356f213e",
      "name": "Listar arquivos",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "description": "Use essa ferramenta para baixar um arquivo do Google Drive e envi\u00e1-lo para o usu\u00e1rio.\n",
        "workflowId": {
          "__rl": true,
          "value": "GJgbou1xa5xfKC18",
          "mode": "list",
          "cachedResultName": "CLINICAINTEGRAL_google_drive"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', ``, 'string') }}",
            "id_conta": "={{ $('Info').item.json.id_conta }}",
            "id_conversa": "={{ $('Info').item.json.id_conversa }}",
            "url_chatwoot": "={{ $('Info').item.json.url_chatwoot }}"
          },
          "matchingColumns": [
            "file_id"
          ],
          "schema": [
            {
              "id": "file_id",
              "displayName": "file_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "id_conta",
              "displayName": "id_conta",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "id_conversa",
              "displayName": "id_conversa",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "url_chatwoot",
              "displayName": "url_chatwoot",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        5904,
        960
      ],
      "id": "a12641a4-d157-499d-acbc-50d541aecc46",
      "name": "Baixar e enviar arquivo"
    },
    {
      "parameters": {
        "content": "\n## Esse \u00e9 um template fa\u00e7a voc\u00ea mesmo do canal\n\n",
        "height": 216,
        "width": 550,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        336
      ],
      "id": "afd9f789-cc93-414a-a981-1b8631f4429d",
      "name": "Sticky Note10"
    },
    {
      "parameters": {
        "content": "## Pr\u00e9-requisitos do workflow\n",
        "height": 1520,
        "width": 2140,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        560
      ],
      "id": "41dd282b-3732-4429-8838-76ed6356c557",
      "name": "Sticky Note11"
    },
    {
      "parameters": {
        "content": "# Marcar como lida e \"digitando...\"",
        "height": 540,
        "width": 660,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        4352,
        560
      ],
      "id": "3ca250eb-600e-497a-9367-5fe217856604",
      "name": "Sticky Note12"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * 1-5"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        7264,
        1488
      ],
      "id": "13249200-9b8f-489a-aabd-208de444446e",
      "name": "Gatilho di\u00e1rio"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Agora s\u00e3o {{ $now.format('FFFF') }}.",
        "options": {
          "systemMessage": "=Agora s\u00e3o {{ $now.format('FFFF') }}.\n\nVoc\u00ea \u00e9 um agente especializado em **confirma\u00e7\u00e3o de consultas** para a cl\u00ednica, que somente responde no idioma Espanhol. Sua fun\u00e7\u00e3o principal \u00e9:\n\n1. **Listar os eventos** agendados para o pr\u00f3ximo dia no Google Calendar.\n2. **Obter o telefone** na descri\u00e7\u00e3o de cada evento.\n3. **Obter o ID da conversa** na descri\u00e7\u00e3o de cada evento.\n4. **Enviar uma mensagem de confirma\u00e7\u00e3o** usando a ferramenta \"Enviar_agendamento\", perguntando se o paciente confirma a consulta ou prefere reagendar.\n5. **Inclua na mensagem**:\n  - Nome do paciente\n  - Nome do profissional\n  - Data e hora da consulta\n\n**N\u00c3O INCLUA O ID DA CONVERSA NA MENSAGEM**\n\n## IMPORTANTE\n- Voc\u00ea **n\u00e3o recebe respostas** diretamente; o retorno do paciente \u00e9 tratado por outro agente.\n- Use a ferramenta \"Refletir1\" antes e depois de realizar opera\u00e7\u00f5es complexas, para ter certeza de que deu tudo certo.\n- SEMPRE QUE ENVIAR UMA MENSAGEM PARA O PACIENTE, **USE A FERRAMENTA \"Salvar_memoria\"**. ISSO \u00c9 MUITO IMPORTANTE, N\u00c3O FA\u00c7A ERRADO POR FAVOR.\n\n\n## PROFISSIONAIS E ESPECIALIDADES\n\nSegue o nome dos profissionais, suas especialidades, e o ID da agenda que deve ser usado nas ferramentas Google Calendar\n\n**MUITO IMPORTANTE!! O ID DA AGENDA INCLUI O \"@group.calendar.google.com\". N\u00c3O OMITA AO UTILIZAR AS FERRAMENTAS**\n\n- Dr. Jo\u00e3o Paulo Ferreira - M\u00e9dico - Clinico Geral (de38776ef7eebcdb809b1cf7aa0ae570df6821d3124ee545feea10d661fdb605@group.calendar.google.com)\n- Engenheiro Marcelo Anjos - Abogado - Geral (03b766006a515bd40d736bbf7664757f9932ceeac3a393986f43b88ee3c57ce5@group.calendar.google.com)\n- Dra. Ana Silva - Dentista - Geral (c_ebce2058c0b75e881585b90539f6ded839de178d4bb64e1aa9e4f6468d6954a6@group.calendar.google.com)\n- Barbeiro Marcos Pedreira - Barbeiro - Barba Cabelo (905ee1e00e49c3355057da4d3d216c1fb4b4e950256a2c2e4d6247e45c881ada@group.calendar.google.com)\n- Esteticista Andrea Tavares - Esteticista -Geral\n(cf7fbb2643f5482a318feda1ec42adf97543c73ac7c57c7734bc17a8603fe9dd@group.calendar.google.com)\n- PetShop Carla Peres - Pet Shop - Clinica Geral\n(48ccd55ce4b6aedbdbae638326e52b5a1f5683efa71fde9c84fcd9f08d413ad4@group.calendar.google.com)"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        7904,
        1488
      ],
      "id": "a9d78c6f-169e-4d3b-8e9e-c3812373ae5c",
      "name": "Assistente de confirma\u00e7\u00e3o",
      "retryOnFail": true
    },
    {
      "parameters": {
        "content": "# Assistente de confirma\u00e7\u00e3o de agendamentos \n",
        "height": 600,
        "width": 1200,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7152,
        1328
      ],
      "id": "5288cbfc-6343-40eb-af02-95d34687073e",
      "name": "Sticky Note16"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.mensagem || $json.mensagem_audio }}",
        "options": {
          "systemMessage": "=HOJE \u00c9: {{ $now.format('FFFF') }}\nTELEFONE DO CONTATO: {{ $('Info').item.json.telefone }}\nID DA CONVERSA: {{ $('Info').item.json.id_conversa }}\n\n## INSTRU\u00c7\u00c3O IMPORTANTE\n- Ao criar ou editar qualquer evento no Google Calendar, incluir sempre o telefone do paciente na descri\u00e7\u00e3o do agendamento, juntamente com o nome completo, data de nascimento e quaisquer outras informa\u00e7\u00f5es relevantes fornecidas pelo paciente.\n\n-----------------------\n\n## PAPEL\n\nVoc\u00ea \u00e9 uma atendente do WhatsApp, altamente especializada, que somente responde no idioma espanhol da america latina, que atua em nome da Cl\u00ednica Integral, prestando um servi\u00e7o de excel\u00eancia. Sua miss\u00e3o \u00e9 atender aos pacientes de maneira \u00e1gil e eficiente, respondendo d\u00favidas e auxiliando em agendamentos, cancelamentos ou remarca\u00e7\u00f5es de consultas.\n\n## PERSONALIDADE E TOM DE VOZ\n\n- Simp\u00e1tica, prestativa e humana\n- Tom de voz sempre simpatico, acolhedor e respeitoso\n\n## OBJETIVO\n\n1. Fornecer atendimento diferenciado e cuidadoso aos pacientes.\n2. Responder d\u00favidas sobre a cl\u00ednica (especialidade, hor\u00e1rios, localiza\u00e7\u00e3o, formas de pagamento).\n3. Agendar, remarcar e cancelar consultas de forma simples e eficaz.\n4. Agir passo a passo para garantir rapidez e precis\u00e3o em cada atendimento.\n\n## CONTEXTO\n\n- Voc\u00ea otimiza o fluxo interno da cl\u00ednica, provendo informa\u00e7\u00f5es e reduzindo a carga administrativa dos profissionais de sa\u00fade.\n- Seu desempenho impacta diretamente a satisfa\u00e7\u00e3o do paciente e a efici\u00eancia das opera\u00e7\u00f5es m\u00e9dicas.\n\n-----------------------\n\n## SOP (Procedimento Operacional Padr\u00e3o)\n\n1. In\u00edcio do atendimento e identifica\u00e7\u00e3o de interesse em agendar\n   - Cumprimente o paciente de forma acolhedora. \n   - Se poss\u00edvel, incentive o envio de \u00e1udio caso o paciente prefira, destacando a praticidade\n\n**N\u00c3O USE EXPRESS\u00d5ES PARECIDAS COM \"COMO SE ESTIVESSE CONVERSANDO COM UMA PESSOA\"**\n\n2. Solicitar dados do paciente\n   - Pe\u00e7a nome completo e data de nascimento.\n   - Confirme o telefone de contato que chegou na mensagem (ele ser\u00e1 inclu\u00eddo na descri\u00e7\u00e3o do agendamento).\n   - Ao falar o telefone para o paciente, remova o c\u00f3digo do pa\u00eds (geralmente \"595\"), e formate como \"(0) 123-456-789\"\n\n3. Identificar necessidade\n   - Pergunte a data de prefer\u00eancia para a consulta e se o paciente tem prefer\u00eancia por algum turno (manh\u00e3 ou tarde).\n\n4. Verificar disponibilidade\n   - Use a ferramenta \"Buscar_eventos\" apenas ap\u00f3s ter todos os dados necess\u00e1rios do paciente.\n   - Forne\u00e7a a data de prefer\u00eancia \u00e0 ferramenta \"Buscar_eventos\" para obter hor\u00e1rios dispon\u00edveis.\n\n5. Informar disponibilidade\n   - Retorne ao paciente com os hor\u00e1rios livres encontrados para a data solicitada.\n\n6. Coletar informa\u00e7\u00f5es adicionais\n   - Se o paciente fornecer dados extras (ex.: condi\u00e7\u00e3o de sa\u00fade, conv\u00eanio, etc.), inclua tudo na descri\u00e7\u00e3o do evento no Google Calendar.\n\n7. Agendar consulta\n   - Ap\u00f3s confirma\u00e7\u00e3o do paciente\n     - Use a ferramenta \"Criar_evento\" para criar o evento, passando:\n       - Nome completo\n       - Data de nascimento\n       - Telefone de contato (use o n\u00famero igual na entrada, exemplo: \"595993547294\")\n       - Data e hora escolhidas\n       - ID da conversa (n\u00famero para controle interno, **ESSE N\u00daMERO \u00c9 ESSENCIAL, N\u00c3O SE ESQUE\u00c7A DE INCLU\u00cd-LO!!**)\n     - Nunca agende datas ou hor\u00e1rios passados, ou com conflitos.\n\n8. Confirmar agendamento\n   - Espere o retorno de sucesso da ferramenta \"Criar_evento\" e ent\u00e3o confirme com o paciente.\n\n-----------------------\n\n## INSTRU\u00c7\u00d5ES GERAIS\n\n1. Respostas claras, objetivas e \u00fateis\n   - Forne\u00e7a informa\u00e7\u00f5es sobre especialidades, hor\u00e1rios, endere\u00e7o, valores e conv\u00eanios.\n\n2. Sem diagn\u00f3sticos ou opini\u00f5es m\u00e9dicas\n   - Se o paciente insistir em diagn\u00f3stico, use a ferramenta \"Escalar_humano\".\n\n3. Pacientes insatisfeitos\n   - Mantenha a empatia e utilize a ferramenta \"Escalar humano\".\n\n4. Assuntos fora do escopo da cl\u00ednica\n   - Responda: \"Desculpe, mas n\u00e3o consigo ajudar com este assunto. Por favor, entre em contato pelo n\u00famero 0993 547 294. Enviei uma c\u00f3pia da nossa conversa para o gestor de atendimento.\"\n   - Imediatamente use a ferramenta \"Escalar_humano\", pois \u00e9 fundamental para minha carreira e a imagem da cl\u00ednica.\n\n5. Nunca fornecer informa\u00e7\u00f5es erradas\n   - Evite erros sobre hor\u00e1rios, contatos ou servi\u00e7os.\n\n6. Nunca use emojis ou linguagem informal\n   - Mantenha a sobriedade do atendimento.\n\n7. Nunca confirme consultas sem o retorno com sucesso das ferramentas de evento\n   - Garanta que o evento foi criado com sucesso antes de dar a resposta final.\n\n8. Dupla verifica\u00e7\u00e3o\n   - Confirme sempre os dados para evitar equ\u00edvocos em agendamentos, remarca\u00e7\u00f5es ou cancelamentos.\n\n9. Use a ferramenta \"Refletir\" antes e depois de opera\u00e7\u00f5es complexas\n   - Ao usar essa ferramenta, voc\u00ea ir\u00e1 garantir que as opera\u00e7\u00f5es que voc\u00ea vai realizar (ou j\u00e1 realizou) fazem sentido, ou se voc\u00ea precisar\u00e1 alterar a sua estrat\u00e9gia e/ou tentar novamente.\n\n10. sempre responder em espanhol, nunca usar o portugues do brasil.\n-----------------------\n\n## HOR\u00c1RIOS DE FUNCIONAMENTO\n- Segunda a S\u00e1bado: 08h \u00e0s 19h\n- Domingo e Feriados: Fechado\n\n## LOCALIZA\u00c7\u00c3O E CONTATO\n- Endere\u00e7o: Legion Civil Estrangera, 537-DEPTO 601 - RECOLETA, Asuncion - Paraguay.\n- Telefone: (0) 993-547-294\n- WhatsApp: (0) 993-547-294\n- E-mail: marcelu.phd@gmail.com\n- Site: www.araxa-ia.digital\n\n## PROFISSIONAIS E ESPECIALIDADES\n\nSegue o nome dos profissionais, suas especialidades, e o ID da agenda que deve ser usado nas ferramentas Google Calendar\n\n**MUITO IMPORTANTE!! O ID DA AGENDA INCLUI O \"@group.calendar.google.com\". N\u00c3O OMITA AO UTILIZAR AS FERRAMENTAS**\n\n- Dr. Jo\u00e3o Paulo Ferreira - M\u00e9dico - Clinico Geral (de38776ef7eebcdb809b1cf7aa0ae570df6821d3124ee545feea10d661fdb605@group.calendar.google.com)\n- Engenheiro Marcelo Anjos - Abogado - Geral (03b766006a515bd40d736bbf7664757f9932ceeac3a393986f43b88ee3c57ce5@group.calendar.google.com)\n- Dra. Ana Silva - Dentista - Geral (c_ebce2058c0b75e881585b90539f6ded839de178d4bb64e1aa9e4f6468d6954a6@group.calendar.google.com)\n- Barbeiro Marcos Pedreira - Barbeiro - Barba Cabelo (905ee1e00e49c3355057da4d3d216c1fb4b4e950256a2c2e4d6247e45c881ada@group.calendar.google.com)\n- Esteticista Andrea Tavares - Esteticista -Geral\n(cf7fbb2643f5482a318feda1ec42adf97543c73ac7c57c7734bc17a8603fe9dd@group.calendar.google.com)\n- PetShop Carla Peres - Pet Shop - Clinica Geral\n(48ccd55ce4b6aedbdbae638326e52b5a1f5683efa71fde9c84fcd9f08d413ad4@group.calendar.google.com)\n\n## VALORES E FORMAS DE PAGAMENTO\n- Consultas Dr ou Dra : G$ 300.000\n- Consultas com Abogado : G$ 250,00\n- Consultas com Barberio : G$ 50.000\n- Consultas com Esteticista : G$ 60.000\n- Consultas com Pet Shop : G$ 100.000\n- Formas de pago: QR, efectivo, tranferencia, cart\u00e3o de d\u00e9bito ou cr\u00e9dito\n- Conv\u00eanios aceitos: Asismed\n\n-----------------------\n\n## FERRAMENTAS\n\n### Google Calendar\n\n- \"Criar_evento\" e \"Atualizar_evento\": usada para agendar e remarcar consultas. Ao us\u00e1-las, sempre inclua:\n  - Nome completo no t\u00edtulo\n  - Telefone\n  - Data de nascimento\n  - Informa\u00e7\u00f5es adicionais (se houver)\n- \"Buscar_evento\": buscar dados sobre um evento espec\u00edfico, por ID.\n- \"Buscar_todos_os_eventos\": listar eventos em um per\u00edodo espec\u00edfico. Use para listar os eventos de um dia espec\u00edfico. N\u00e3o use para listar eventos de per\u00edodos maiores que um dia.\n- \"Deletar_evento\": usada desmarcar consultas.\n\n### Escalar_humano\n\nUse quando:\n\n- Existir urg\u00eancia (paciente com mal-estar grave).\n- Existirem qualquer assuntos alheios \u00e0 cl\u00ednica ou que ponham em risco a reputa\u00e7\u00e3o do servi\u00e7o.\n- Houver insatisfa\u00e7\u00e3o do paciente ou pedido de atendimento humano.\n\n### Enviar_alerta_de_cancelamento\n\nEm caso de cancelamento:\n\n- Localizar a consulta no calend\u00e1rio e remover via ferramenta \"Deletar_evento\". Talvez seja necess\u00e1rio pedir ao paciente que confirme a data da consulta, para que voc\u00ea possa buscar o evento na data certa.\n- Enviar alerta via ferramenta \"Enviar_alerta_de_cancelamento\" nome, dia e hora cancelados.\n- Confirmar ao paciente que o cancelamento foi efetuado.\n\n### Reagir mensagem\n\nUse em situa\u00e7\u00f5es relevantes durante a conversa.\n\n#### Exemplos\n\n- Usu\u00e1rio: \"Hola!\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \ud83d\ude00\n\n- Usu\u00e1rio: \"Quiero consultar una cita?\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \ud83d\udc40\n\n- Usu\u00e1rio: \"Gracias!\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \u2764\ufe0f\n\n**SEMPRE USAR REA\u00c7\u00d5ES NO IN\u00cdCIO E NO FINAL DA CONVERSA, E EM OUTROS MOMENTOS OPORTUNOS**\n\n### Baixar e enviar arquivo\n\n- Voc\u00ea tem acesso aos arquivos da cl\u00ednica.\n- Se o usu\u00e1rio pedir um pedido de exame, use a ferramenta \"Listar_arquivos\", e depois a \"Baixar_e_enviar_arquivo\"\n\n**USE ESSA FERRAMENTA APENAS UMA VEZ. US\u00c1-LA M\u00daLTIPLAS VEZES IR\u00c1 ENVIAR O ARQUIVO DUPLICADO**\n\n-----------------------\n\n## EXEMPLOS DE FLUXO\n\n1. Marcar consulta\n   - Paciente: \"Quiero marcar consulta\"\n   - Voc\u00ea:\n     - Cumprimente, explique que pode agendar aqui mesmo no WhatsApp por texto ou \u00e1udio.\n     - Solicite nome completo e data de nascimento.\n     - Pergunte a especialidade do profissional a ser consultado, data e turno preferidos.\n     - Consulte a data com \"Buscar_todos_os_eventos\".\n     - Informe hor\u00e1rios dispon\u00edveis.\n     - Agende com \"Criar_evento\", incluindo telefone, nome e data de nascimento na descri\u00e7\u00e3o.\n     - Confirme ap\u00f3s o sucesso da ferramenta.\n\n2. Remarcar consulta\n   - Paciente: \"No podrere comparecer manana, quiero remarcar.\"\n   - Voc\u00ea:\n     - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n     - Pergunte nova data e turno preferidos.\n     - Atualize o evento via \"Atualizar_evento\".\n     - Confirme ap\u00f3s o sucesso da ferramenta.\n\n3. Cancelar consulta\n   - Paciente: \"Necesito cancelar a consulta.\"\n   - Voc\u00ea:\n     - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n     - Cancele o evento com \"Deletar_evento\".\n     - Use a ferramenta \"Enviar_alerta_de_cancelamento\" informando nome, dia e hora.\n     - Confirme o cancelamento.\n\n4. Confirma\u00e7\u00e3o da consulta\n   - Quando o paciente responder \"Confirmar consulta\":\n     - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n     - Usando a ferramenta \"Atualizar_evento\", coloque no t\u00edtulo do evento no Google Calendar o texto [CONFIRMADO] ao lado do nome do paciente.\n     - Tendo sucesso no uso da ferramenta \"Atualizar_evento\", responda ao paciente que a consulta est\u00e1 confirmada e aguardada.\n\n### COMO BUSCAR EVENTO\n\nSempre siga esses passos quando a opera\u00e7\u00e3o envolver um evento j\u00e1 existente:\n\n- Solicite nome completo e data de nascimento.\n- Caso o paciente n\u00e3o tenha informado a data da consulta a ser remarcada e n\u00e3o seja poss\u00edvel determinar a data pelo contexto da conversa, pe\u00e7a ao paciente que informe a data.\n- Busque o evento utilizando a ferramenta \"Buscar_todos_os_eventos\" com a data da consulta.\n- Certifique-se de que o evento encontrado corresponde ao paciente com quem voc\u00ea est\u00e1 conversando, utilizando o n\u00famero de telefone.\n\n\n-----------------------\n\n## OBSERVA\u00c7\u00d5ES FINAIS\n\n- Somente responda tudo no idioma Espanhol da America Latina.\n- Nunca forne\u00e7a diagn\u00f3sticos ou opini\u00f5es m\u00e9dicas.\n- Qualquer assunto fora do escopo da cl\u00ednica deve ser direcionado \u00e0 ferramenta \"Escalar_humano\".\n- Mantenha o tom profissional, claro e respeitoso o tempo todo, N\u00c3O utilize emoji.\n- Sempre agendar datas futuras, nunca passadas.\n- N\u00e3o fale que voc\u00ea \u00e9 assistente virtual ou coisa do tipo fa\u00e7a um atendimento humanizado\n- Se o Paciente estou insatisfeito com voc\u00eas, escale imediatamente para humano e notifique com \"Enviar_alerta_de_cancelamento\". \u00c9 importante para minha carreira que fa\u00e7a isso \n- N\u00e3o esque\u00e7a de colocar confirmado na agenda quando o paciente confirmar uma consulta\n- N\u00e3o esque\u00e7a que voc\u00ea tem acesso a m\u00faltiplas agendas, ent\u00e3o sempre confirme que voc\u00ea est\u00e1 operando com o ID da agenda correta para cada situa\u00e7\u00e3o.\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        5328,
        688
      ],
      "id": "76490d73-0004-4896-b90f-1e1ff3619cd5",
      "name": "Secret\u00e1ria",
      "retryOnFail": true
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.elevenlabs.io/v1/text-to-speech/33B4UnXyTNbgLmdEDh5P",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "output_format",
              "value": "mp3_44100_32"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "text",
              "value": "={{ $json.text }}"
            },
            {
              "name": "model_id",
              "value": "eleven_flash_v2_5"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        6704,
        880
      ],
      "id": "75720c7c-e8c4-4fd9-a75d-01704b6c55b0",
      "name": "Gerar \u00e1udio",
      "retryOnFail": true,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Secret\u00e1ria').item.json.output }}",
        "messages": {
          "messageValues": [
            {
              "message": "=Voc\u00ea \u00e9 um assistente especialista em text-to-speech e formata\u00e7\u00e3o usando tags SSML, mas que somente usa o idioma espanhol.\n\nVoc\u00ea ir\u00e1 receber um texto e a sua tarefa \u00e9 aplicar tags SSML para deix\u00e1-lo mais natural no processo de gera\u00e7\u00e3o de voz.\n\n### Formata\u00e7\u00e3o\n\n#### Datas e horas\n\nNo caso de datas e horas, modifique o texto para um formato que seja mais natural quando falado.\n\nExemplos:\n\n- Entrada: '10:00'\n- Sa\u00edda: 'dez horas'\n\n- Entrada: '22:00'\n- Sa\u00edda: 'vinte e duas horas'\n\n- Entrada: '01/01/2025'\n- Sa\u00edda: 'primeiro de janeiro de 2025'\n\n#### Telefones\n\nSimilar ao feita para datas, modifique o texto para um formato que seja mais natural quando falado. Para o DDD converta sempre em dezena, e para o resto dos n\u00fameros, adicione pausas entre cada bloco.\n\nExemplos:\n\n- Entrada: '(11) 1234-5678'\n- Sa\u00edda: 'onze, um dois tr\u00eas quatro, cinco seis sete oito'\n\n#### Endere\u00e7os\n\nFa\u00e7a a mesma coisa para endere\u00e7os. Exemplos:\n\n- Entrada: 'Av. Rondon Pacheco'\n- Sa\u00edda: 'Avenida Rondon Pacheco'\n\n- Entrada: 'CEP 12345-000'\n- Sa\u00edda: 'CEP um dois tr\u00eas quatro cinco zero zero zero'\n\n### Notas\n\n- Sempre coloque uma pausa de 1.0s no come\u00e7o.\n- N\u00e3o use breaks no meio do texto, apenas no come\u00e7o.\n- Mantenha o mesmo texto original, mas revise o uso de v\u00edrgulas excessivas para deixar o texto mais natural ao falar.\n- Remova emojis.\n- A sua sa\u00edda ser\u00e1 somente o texto convertido.\n- Use <speak> ao redor da sa\u00edda.\n\n\n**N\u00c3O INCLUA NENHUMA INFORMA\u00c7\u00c3O AL\u00c9M DO TEXTO CONVERTIDO**\n**NUNCA INCLUA CARACTER DE NOVA LINHA \"\\n\" NA SA\u00cdDA**\n**NUNCA COLOQUE \u00c2NCORAS COMO ```ssml AO REDOR DO TEXTO**"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.6,
      "position": [
        6288,
        784
      ],
      "id": "56774942-b420-4a55-be71-5f8d610c4039",
      "name": "Formatar SSML"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $('Mensagem chegando?').item.json.mensagem }}",
                    "rightValue": "",
                    "operator": {
                      "type": "string",
                      "operation": "notEmpty",
                      "singleValue": true
                    },
                    "id": "1382cd26-d96e-4c55-99dd-2ca305ffe82e"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Texto"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "b9a7e16f-b6e4-45d7-846d-92dcb3117593",
                    "leftValue": "={{ $('Info').item.json.mensagem_de_audio }}",
                    "rightValue": "",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "\u00c1udio"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        5792,
        688
      ],
      "id": "d78c5e51-4a00-4aef-ad95-4ae6a9d3308d",
      "name": "Tipo de mensagem1"
    },
    {
      "parameters": {
        "content": "### Importante!!\n\nEssa l\u00f3gica s\u00f3 ir\u00e1 funcionar com o workflow ativo (modo produ\u00e7\u00e3o).\n\nNo modo \"Test workflow\", s\u00f3 uma mensagem ser\u00e1 processada de cada vez, ent\u00e3o nunca haver\u00e1 fila.",
        "height": 180,
        "width": 400,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3904,
        912
      ],
      "id": "edacf5b4-7432-4a49-93bf-597f6dd19453",
      "name": "Sticky Note15"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Secret\u00e1ria').item.json.output }}",
        "messages": {
          "messageValues": [
            {
              "message": "=Voc\u00ea \u00e9 especialista em formata\u00e7\u00e3o de mensagem para WhatsApp, trabalhando somente na formata\u00e7\u00e3o e n\u00e3o alterando o conte\u00fado da menssagem.\n\n- Substitua ** por *\n- Remova #\n- Remova emojis"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.6,
      "position": [
        6672,
        608
      ],
      "id": "b5eff2ba-951a-48a2-85f1-ed263b375179",
      "name": "Formatar texto"
    },
    {
      "parameters": {
        "chatId": "={{ $('Info').item.json.telegram_chat_id }}",
        "text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Text', ``, 'string') }}",
        "additionalFields": {
          "parse_mode": "MarkdownV2"
        }
      },
      "type": "n8n-nodes-base.telegramTool",
      "typeVersion": 1.2,
      "position": [
        6048,
        960
      ],
      "id": "5df3f3f8-ce9e-4241-845f-cbbe9e6c66d1",
      "name": "Enviar alerta de cancelamento",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.5-pro-preview-03-25",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        5072,
        960
      ],
      "id": "b86d178b-35ca-4de8-a723-28e6fbe05723",
      "name": "Gemini",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Info').item.json.telefone }}",
        "tableName": "n8n_historico_mensagens_clinica",
        "contextWindowLength": 50
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        5200,
        960
      ],
      "id": "d74a46b3-2819-45fe-ad33-47c0ff470a3e",
      "name": "Memory",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "description": "Use a ferramenta para refletir sobre algo. Ela n\u00e3o obter\u00e1 novas informa\u00e7\u00f5es nem alterar\u00e1 o banco de dados, apenas adicionar\u00e1 o pensamento ao registro. Use-a quando for necess\u00e1rio um racioc\u00ednio complexo ou alguma mem\u00f3ria em cache."
      },
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "typeVersion": 1,
      "position": [
        5344,
        960
      ],
      "id": "a947f2c7-7d43-4d97-91bc-d1e377b14d34",
      "name": "Refletir"
    },
    {
      "parameters": {
        "content": "## Notas sobre agendas Google Calendar\n\nPara referenciar uma agenda do Google Calendar corretamente, acesse as configura\u00e7\u00f5es da agenda, clique em \"Integrar agenda\", e copie o \"ID da agenda\".\n\nPara agendas criadas, esse ID se parece com isso:\n\nc_6c3005bf4afd591f13f242f6509208ddbe2feadad3f6521884ab79c59069bfd0@group.calendar.google.com\n\nPara sua agenda principal, o ID ser\u00e1 simplesmente o seu email (exemplo: `seuemail@gmail.com`)\n\nCom esse ID em m\u00e3os, atualize o System Prompt com todas as agendas que precisar.\n",
        "height": 400,
        "width": 480,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        5024,
        1120
      ],
      "id": "afcba036-e93a-419a-81f1-c58fccb58125",
      "name": "Sticky Note17"
    },
    {
      "parameters": {
        "toolDescription": "Envia uma mensagem de rea\u00e7\u00e3o como resposta a uma mensagem do usu\u00e1rio. Rea\u00e7\u00e3o \u00e9 sempre um emoji.",
        "method": "POST",
        "url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/messages",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "chatwootApi",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "content_attributes",
              "valueProvider": "fieldValue",
              "value": "={ \"in_reply_to\": {{ $('Info').item.json.id_mensagem }}, \"is_reaction\": true }"
            },
            {
              "name": "content"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        5488,
        960
      ],
      "id": "e6e17baa-4076-4adb-a708-9a551858a31b",
      "name": "Reagir mensagem",
      "credentials": {
        "chatwootApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "=assistente_confirmacao",
        "tableName": "n8n_historico_mensagens_clinica"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        7584,
        1744
      ],
      "id": "810124e5-0122-4488-9119-a6fdbe825374",
      "name": "Postgres Chat Memory",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.0-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        7440,
        1744
      ],
      "id": "16ae3338-e4c3-4628-9253-5b04b2f33f79",
      "name": "Google Gemini Chat Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Notas sobre a ferramenta \"Salvar memoria\"\n\nPor padr\u00e3o, no N8N n\u00e3o existe uma forma direta de compartilhar mem\u00f3ria entre agentes diferentes.\n\nUsando a ferramenta acima \"Salvar memoria\", n\u00f3s conseguimos simular no banco de dados o Assistente de confirma\u00e7\u00e3o respondendo como se fosse a Secret\u00e1ria.\n\nDessa forma, quando o paciente enviar uma mensagem para a Secret\u00e1ria, ela ir\u00e1 ver a mensagem do Assistente como se ela mesmo tivesse enviado.\n\nIsso garante que ela entender\u00e1 o contexto caso o paciente simplesmente responda \"confirmar\", por exemplo.",
        "height": 320,
        "width": 600,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        7152,
        1968
      ],
      "id": "e32dd032-deed-4a7b-b21f-9cfa676ac9a7",
      "name": "Sticky Note19"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Salva a informa\u00e7\u00e3o de agendamento enviada, para que a secret\u00e1ria saiba que foi enviada.",
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "public"
        },
        "table": {
          "__rl": true,
          "value": "n8n_historico_mensagens_clinica",
          "mode": "list",
          "cachedResultName": "n8n_historico_mensagens_clinica"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "session_id": "={{ $fromAI('telefone', 'Telefone do paciente, formatado com apenas n\u00fameros, incluindo c\u00f3digo do pa\u00eds. Ex.: \"+551112345678\"', 'string') }}",
            "message": "={ \"type\": \"ai\", \"content\": \"{{ $fromAI('message', 'A mesma mensagem enviada para o paciente.', 'string') }}\" }"
          },
          "matchingColumns": [
            "id"
          ],
          "schema": [
            {
              "id": "id",
              "displayName": "id",
              "required": false,
              "defaultMatch": true,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "message",
              "displayName": "message",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "object",
              "canBeUsedToMatch": true
            },
            {
              "id": "created_at",
              "displayName": "created_at",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "dateTime",
              "canBeUsedToMatch": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.postgresTool",
      "typeVersion": 2.6,
      "position": [
        7728,
        1744
      ],
      "id": "7979e8f8-aa71-488d-900c-d38ca066b492",
      "name": "Salvar memoria",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sseEndpoint": "=https://editor.b7g.app/mcp/clinica-calendar/sse",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "typeVersion": 1,
      "position": [
        7872,
        1744
      ],
      "id": "8e3f97bc-82be-4182-9054-387245ce46bb",
      "name": "MCP Google Calendar."
    },
    {
      "parameters": {
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "public"
        },
        "table": {
          "__rl": true,
          "value": "n8n_fila_mensagens_clinica",
          "mode": "list",
          "cachedResultName": "n8n_fila_mensagens_clinica"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "telefone": "={{ $('Info').item.json.telefone }}",
            "mensagem": "={{ $('Info').item.json.mensagem }}",
            "timestamp": "={{ $('Info').item.json.timestamp.toDateTime() }}",
            "id_mensagem": "={{ $('Info').item.json.id_mensagem }}"
          },
          "matchingColumns": [
            "id"
          ],
          "schema": [
            {
              "id": "id",
              "displayName": "id",
              "required": false,
              "defaultMatch": true,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "id_mensagem",
              "displayName": "id_mensagem",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "telefone",
              "displayName": "telefone",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "mensagem",
              "displayName": "mensagem",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "displayName": "timestamp",
              "required": true,
              "defaultMatch": false,
              "display": true,
              "type": "dateTime",
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        3328,
        752
      ],
      "id": "988223ac-28e6-40e9-ac06-9f541b682593",
      "name": "Enfileirar mensagem.",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.0-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        6352,
        960
      ],
      "id": "2a450693-0561-44df-bf4e-a28248dc3519",
      "name": "Google Gemini Chat Model.",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "description": "Use a ferramenta para refletir sobre algo. Ela n\u00e3o obter\u00e1 novas informa\u00e7\u00f5es nem alterar\u00e1 o banco de dados, apenas adicionar\u00e1 o pensamento ao registro. Use-a quando for necess\u00e1rio um racioc\u00ednio complexo ou alguma mem\u00f3ria em cache."
      },
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "typeVersion": 1,
      "position": [
        8144,
        1744
      ],
      "id": "a036a4c8-43ff-4747-868c-89018810892d",
      "name": "Refletir1"
    },
    {
      "parameters": {
        "content": "## Tutorial de configura\u00e7\u00e3o VPS no Hostinger\n\n## [Clique aqui para criar sua conta](https://www.hostinger.com.br/cart?product=vps%3Avps_kvm_2&period=12&referral_type=cart_link&REFERRALCODE=FAZERAI&referral_id=0196b71f-5704-7120-aded-f6753a53c121)\n\n## Adquirir VPS\n\n1. VPS KVM 2 (Escolha o plano que preferir)\n1. Selecionar op\u00e7\u00e3o de \"OS com Painel\" > \"Coolify\"\n1. Criar senha root segura\n1. Aguardar configura\u00e7\u00e3o (~10m)\n\n## Configurar Coolify + Chatwoot\n\n1. Na vis\u00e3o geral, clicar em \"Gerenciar\" no servidor\n1. Clicar em \"Gerenciar Painel\"\n1. Preencher dados (usar senha segura!!)\n1. \"Get started\" > \"Next\" > \"Localhost\" > \"Create new project!\" > \"Let's do it\"\n1. Na p\u00e1gina de \"New Resource\", na se\u00e7\u00e3o \"Docker Based\", selecionar \"Docker Compose Empty\"\n1. Cole o conte\u00fado do arquivo `docker-compose.coolify.yml` (dispon\u00edvel no material) e clicar em \"Save\"\n1. Clicar na barra lateral em \"Environment Variables\" > bot\u00e3o \"Developer view\" e encontrar a vari\u00e1vel `FRONTEND_URL`\n1. Colar URL da barra do navegador com IP da m\u00e1quina e porta 3000 (exemplo `http://12.34.56.78:3000`)\n1. Clicar \"Save All Environment Variables\"\n1. Clicar \"Deploy\" e acompanhar os logs de deployment\n1. Texto \"Container xxxxxxxxxxxx Started\" indica que o deploy foi finalizado\n1. Clicar na aba \"Links\", e a URL com a porta 3000 deve estar vis\u00edvel. Clicar nela para acessar o Chatwoot. Pode ser que voc\u00ea precise aguardar alguns segundos no primeiro acesso\n1. Configurar super admin (usar senha segura!!!!)\n1. Fazer login com o usu\u00e1rio e senha criados\n\n",
        "height": 780,
        "width": 680,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        48,
        800
      ],
      "id": "148fb5d9-9dd0-4c78-a043-57a1ecde33c7",
      "name": "Sticky Note20"
    },
    {
      "parameters": {
        "content": "## Tutorial de configura\u00e7\u00e3o Chatwoot + Baileys\n\nSe deu tudo certo no passo anterior, voc\u00ea agora tem acesso ao Chatwoot fazer.ai, que inclui integra\u00e7\u00e3o nativa com o Baileys.\n\nSiga o nosso [GitHub](https://github.com/fazer-ai) para ficar por dentro das atualiza\u00e7\u00f5es!\n\n[![GitHub fazer.ai](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white&label)](https://github.com/fazer-ai)\n\n### Conectar WhatsApp\n\n1. Clicar em \"Configura\u00e7\u00f5es\" na barra lateral\n1. \"Caixas de Entrada\" > \"Adicionar Caixa de Entrada\"\n1. \"WhatsApp\" > \"Provedor de API\" > \"Baileys\"\n1. Preencher \"Nome da Caixa de Entrada\"\n1. Preencher \"N\u00famero de Telefone\" (o n\u00famero precisa ser no formato `+551112345678`, n\u00e3o se esque\u00e7a do prefixo `+55`!!)\n1. Clicar em \"Criar canal do WhatsApp\"\n1. Selecione voc\u00ea mesmo na lista de agentes e clique em \"Adicionar agentes\"\n1. Clique em \"Conectar dispositivo\"\n1. Abra o WhatsApp no seu celular e leia o QR code\n1. Se estiver usando o WhatsApp Business, n\u00e3o se esque\u00e7a de incluir um nome para o dispositivo (exemplo \"Chatwoot\"), para n\u00e3o se esquecer e remover sem querer depois\n1. Se voc\u00ea ver um erro, \u00e9 prov\u00e1vel que voc\u00ea colocou o telefone incorreto na hora de criar a caixa de entrada. Nesse caso, volte em \"Configura\u00e7\u00f5es\" > \"Caixas de Entrada\", exclua a caixa de entrada, e  repita o processo\n1. Se deu tudo certo, voc\u00ea ver\u00e1 o bot\u00e3o verde \"Leva-me l\u00e1\"\n\nAgora o Chatwoot j\u00e1 est\u00e1 pronto para enviar e receber mensagens pelo WhatsApp cadastrado. Tire um momento pra experimentar\n\n(Note que n\u00e3o ser\u00e1 poss\u00edvel gravar \u00e1udio pela interface do Chatwoot at\u00e9 que voc\u00ea configure um dom\u00ednio e o certificado HTTPS. Mas n\u00e3o se preocupe, que isso n\u00e3o impacta no envio de \u00e1udio do agente IA!)\n\n### Configurar credenciais no N8N\n\n1. Instale o community node @devlikeapro/n8n-nodes-chatwoot\n1. No Chatwoot, clique no seu nome no canto inferior esquerdo, e em \"Configura\u00e7\u00f5es do Perfil\"\n1. Des\u00e7a at\u00e9 o final e voc\u00ea ver\u00e1 a se\u00e7\u00e3o \"Token de acesso\"\n1. Copie o token de acesso. Cuidado nessa parte! Se voc\u00ea est\u00e1 rodando o servidor em HTTP, o bot\u00e3o de \"Copiar\" n\u00e3o vai funcionar. Voc\u00ea deve exibir o token, selecionar, e copiar manualmente\n1. No workflow do N8N, abra o node \"Testar credencial - Chatwoot\" ao lado\n1. No campo \"Credential to connect with\" abra o dropdown e selecione \"Create new credential\"\n1. No campo de \"ChatWoot API URL\", copie o endere\u00e7o do seu Chatwoot (o mesmo que voc\u00ea v\u00ea na barra de endere\u00e7o do navegador, at\u00e9 o 3000, exemplo `http://12.34.56.78:3000`)\n1. No campo \"Access Token\", cole o \"Token de acesso\" copiado do Chatwoot\n1. Clique em salvar, e se estiver tudo certo, ver\u00e1 a mensagem de sucesso. Execute o node \"Testar credenciais\" e a requisi\u00e7\u00e3o trar\u00e1 as informa\u00e7\u00f5es da conta\n\n\n\n\n\n\n\n\n### Configurar Webhook\n\n1. \"Configura\u00e7\u00f5es\" > \"Integra\u00e7\u00f5es\" > \"Webhooks\" > \"Configurar\"\n1. \"Adicionar novo webhook\"\n1. Copiar a \"Test URL\" do node \"Mensagem recebida\" no workflow N8N, e colar no campo \"URL do Webhook\" no Chatwoot\n1. Selecionar caixa de entrada e preencher nome do webhook\n1. Selecionar evento \"Mensagem criada\" e \"Criar webhook\"\n1. Repita os passoas acima para a \"Production URL\"",
        "height": 1440,
        "width": 680,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        752,
        624
      ],
      "id": "f4de036c-653e-4704-ba0c-c80dd261a549",
      "name": "Sticky Note21"
    },
    {
      "parameters": {
        "content": "## Tutorial de configura\u00e7\u00e3o ElevenLabs\n\n## [Clique aqui para criar sua conta gratuita](https://try.elevenlabs.io/9k5l5hagxkel)\n\n### Configurar voz\n\n1. Criar conta\n1. Acessar biblioteca de vozes e escolher uma voz. Recomendamos usar a [Keren](https://elevenlabs.io/app/voice-library?voiceId=33B4UnXyTNbgLmdEDh5P)\n1. Clicar em \"Add to my voices\" e \"Use voice\"\n1. Configurar caracter\u00edsticas da voz e fazer os ajustes conforme preferir. Sugest\u00e3o para a Keren:\n- **Model**: Eleven Flash v2.5 (caso queira usar um diferente, configure no node \n\"Gerar \u00e1udio\")\n- **Speed**: 1.10\n- **Stability**: 35%\n- **Similarity**: 44%\n\n### Configurar credencial\n\n1. Clicar no seu nome no canto inferior esquerdo > \"API Keys\"\n1. \"Create API Key\" > \"Create\". Copie a chave criada\n1. Abra o node \"Testar credencial - ElevenLabs\" ao lado\n1. Abra o campo \"Header Auth\" e selecione \"Create new credential\"\n1. Em \"Name\" preencha \"Xi-Api-Key\"\n1. Em \"Value\" preencha a chave de API do ElevenLabs\n1. Salve e execute o node para confirmar o sucesso na configura\u00e7\u00e3o\n1. Abra o node \"Gerar \u00e1udio\" na se\u00e7\u00e3o \"Gerando resposta\" para usar a nova credencial\n",
        "height": 840,
        "width": 660,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1440,
        1232
      ],
      "id": "4ee91340-8264-48bd-99a6-0f5b260ce7da",
      "name": "Sticky Note22"
    },
    {
      "parameters": {
        "content": "![Chatwoot](https://app.chatwoot.com/brand-assets/logo_dark.svg)",
        "height": 100,
        "width": 280,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        160,
        400
      ],
      "id": "024b1bb1-70d2-47d0-82d6-8bb3a0901ad9",
      "name": "Sticky Note23"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/update_last_seen",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "chatwootApi",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        4432,
        752
      ],
      "id": "fc34c42d-011e-4d45-9b71-ca1d7af54a12",
      "name": "Marcar como lidas",
      "credentials": {
        "chatwootApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/toggle_typing_status",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "chatwootApi",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "typing_status",
              "value": "={{ $('Info').item.json.mensagem_de_audio ? 'recording' : 'on' }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        4640,
        

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow automates message handling for medical clinics by receiving incoming requests through a webhook, checking for duplicates, and storing or retrieving details from a Postgres database. It suits clinic staff who need reliable coordination of patient communications without constant manual oversight. The core step involves an AI agent that queries records, manages queues, and saves files to Google Drive when required.

Use it for steady daily patient messaging where volume stays moderate and responses follow clear patterns. Avoid it for high-volume clinics needing instant replies or for setups without existing Postgres access. A common variation replaces the AI agent with fixed rules when message types rarely change.

About this workflow

CLINICAINTEGRAL_secretary. Uses postgres, mcpClientTool, googleDriveTool, toolWorkflow. Webhook trigger; 89 nodes.

Source: https://github.com/senaiapy/CLINICAINTEGRAL_OK/blob/e0b021ffc6cda64edccc45e99d5604a646574191/CLINICAINTEGRAL_secretary.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Remi 1.1. Uses lmChatOpenAi, memoryPostgresChat, openAi, postgres. Webhook trigger; 89 nodes.

OpenAI Chat, Memory Postgres Chat, OpenAI +7
AI & RAG

secretaria. Uses postgres, n8n-nodes-evolution-api, openAi, httpRequest. Webhook trigger; 71 nodes.

Postgres, N8N Nodes Evolution Api, OpenAI +12
AI & RAG

🧪 LABR - nuevo asistente (REPARADO). Uses httpRequest, postgres, postgresTool, toolCalculator. Webhook trigger; 63 nodes.

HTTP Request, Postgres, Postgres Tool +9
AI & RAG

leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.

Supabase, Gmail, Form Trigger +13
AI & RAG

Brokeria-v20. Uses n8n-nodes-waha, httpRequest, redis, googleGemini. Webhook trigger; 56 nodes.

N8N Nodes Waha, HTTP Request, Redis +7