AutomationFlowsAI & RAG › Agendamento Clinica Odonto

Agendamento Clinica Odonto

Agendamento_clinica_odonto. Uses openAi, n8n-nodes-evolution-api, vectorStoreSupabase, embeddingsOpenAi. Webhook trigger; 72 nodes.

Webhook trigger★★★★★ complexityAI-powered72 nodesOpenAIN8N Nodes Evolution ApiSupabase Vector StoreOpenAI EmbeddingsOpenAI ChatTool Vector StoreAgentMemory Postgres Chat
AI & RAG Trigger: Webhook Nodes: 72 Complexity: ★★★★★ AI nodes: yes Added:

This workflow follows the Agent → OpenAI Embeddings 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
{
  "updatedAt": "2025-06-22T11:27:44.378Z",
  "createdAt": "2025-06-22T00:55:35.228Z",
  "id": "0aZAV8dJeIIwIqNG",
  "name": "Agendamento_clinica_odonto",
  "active": false,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "minas",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        80,
        780
      ],
      "id": "f962d627-03e0-4435-a8d9-ba7380fce475",
      "name": "Webhook"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        340,
        1020
      ],
      "id": "d81130a4-8c36-4327-b008-932683d0ba50",
      "name": "No Operation, do nothing"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "0259c57e-bef5-48e3-b177-a6dc1a2e8647",
                    "leftValue": "={{ $('talvez').item.json.body.data.messageType }}",
                    "rightValue": "audioMessage",
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    }
                  }
                ],
                "combinator": "and"
              }
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $('talvez').item.json.body.data.messageType }}",
                    "rightValue": "=conversation",
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    },
                    "id": "30495cfd-24cf-4330-84ce-4002a65576c6"
                  }
                ],
                "combinator": "and"
              }
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        540,
        860
      ],
      "id": "71643535-94b2-4db7-b55c-4fc2da69c69b",
      "name": "Switch"
    },
    {
      "parameters": {
        "operation": "toBinary",
        "sourceProperty": "body.data.message.base64",
        "options": {
          "fileName": "file.ogg",
          "mimeType": "={{ $json.mimetype }}"
        }
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        900,
        760
      ],
      "id": "26f96954-293b-49dc-91d0-d1b7e95b464c",
      "name": "Convert to File"
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        1040,
        760
      ],
      "id": "b8838c4a-47bf-4d9f-b595-df43e3294c65",
      "name": "OpenAI",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ccab6387-9377-4854-b7c6-5e2ac41101f5",
              "name": "body.data.message.base64",
              "value": "={{ $('Webhook').item.json.body.data.message.base64 }}",
              "type": "string"
            },
            {
              "id": "ec1dec80-6359-464d-9def-b9cf11f6fc2e",
              "name": "mimetype",
              "value": "={{ $('Webhook').item.json.body.data.message.audioMessage.mimetype }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        760,
        760
      ],
      "id": "55d8cd23-5bae-4478-8af4-a5b3ddbf8fe8",
      "name": "Edit Fields2"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.1,
      "position": [
        1300,
        920
      ],
      "id": "af54fc0b-16f1-4a71-875d-d3cfea75dfbf",
      "name": "Merge",
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "35c93b70-527d-4e6d-9710-704c605118e2",
              "name": "Nome",
              "value": "={{ $('talvez').item.json.body.data.pushName }}",
              "type": "string"
            },
            {
              "id": "1283553a-10be-421f-9e9f-cd813415897b",
              "name": "Message",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1180,
        760
      ],
      "id": "2a7bbeb4-e365-4a79-b768-203b698009c4",
      "name": "Edit Fields4"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "typeVersion": 1,
      "position": [
        2860,
        780
      ],
      "id": "6f363f45-b613-408f-aaee-f85210eaa641",
      "name": "Evolution API1",
      "credentials": {}
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1260,
        1240
      ],
      "id": "7923439b-6b54-49c4-be88-bf52cb58366a",
      "name": "No Operation, do nothing1"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "a88ded29-64c0-40e0-954b-1d6de2cedf29",
              "leftValue": "={{ $json.body.event }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              }
            },
            {
              "id": "efa83966-5563-403c-aa8e-5d5df503f2a7",
              "leftValue": "={{ $json.body.data.key.fromMe }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        320,
        780
      ],
      "id": "135f2920-80e6-47b8-84e6-a686deb36c6f",
      "name": "talvez"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "35c93b70-527d-4e6d-9710-704c605118e2",
              "name": "Nome",
              "value": "={{ $('talvez').item.json.body.data.pushName }}",
              "type": "string"
            },
            {
              "id": "1283553a-10be-421f-9e9f-cd813415897b",
              "name": "Message",
              "value": "={{ $json.body.data.message.conversation }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        760,
        940
      ],
      "id": "5f7c280e-ffb2-48b7-b77a-24d4ed794971",
      "name": "Edit Fields"
    },
    {
      "parameters": {
        "tableName": {
          "__rl": true,
          "value": "sobre_a_clinica",
          "mode": "list",
          "cachedResultName": "sobre_a_clinica"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "typeVersion": 1.1,
      "position": [
        3360,
        1100
      ],
      "id": "d2b2ace1-f41f-4f0a-8fdc-6852d449f097",
      "name": "Supabase Vector Store"
    },
    {
      "parameters": {
        "model": "text-embedding-3-large",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        3200,
        1240
      ],
      "id": "4f0f8baf-f195-4bf4-960c-5abcba596d8e",
      "name": "Embeddings OpenAI1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        3700,
        1240
      ],
      "id": "be772d0a-e6c9-4410-bcc0-766936f35f02",
      "name": "OpenAI Chat Model2",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "sobre_a_clinica",
        "description": "Aqui tem as informa\u00e7\u00f5es sobre a clinica",
        "topK": "=4"
      },
      "type": "@n8n/n8n-nodes-langchain.toolVectorStore",
      "typeVersion": 1,
      "position": [
        3600,
        940
      ],
      "id": "5298cd39-54ad-479e-8d13-582ba17b0feb",
      "name": "Vector Store"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.body.message }}",
        "options": {
          "systemMessage": "=\nVoc\u00ea \u00e9 um agente de IA especializado em fornecer informa\u00e7\u00f5es precisas e atualizadas sobre uma cl\u00ednica odontol\u00f3gica. Seu papel \u00e9 atender exclusivamente \u00e0s solicita\u00e7\u00f5es feitas pelo usu\u00e1rio, oferecendo dados completos e bem detalhados sobre o funcionamento da cl\u00ednica, hor\u00e1rios, servi\u00e7os oferecidos e demais d\u00favidas institucionais.\n\nObjetivo:\nAuxiliar o usu\u00e1rio, fornecendo dados corretos, com base na base de conhecimento da cl\u00ednica odontol\u00f3gica, de forma detalhada, clara e organizada.\n\nDiretrizes:\nComunica\u00e7\u00e3o e Precis\u00e3o:\n\nSuas respostas ser\u00e3o utilizadas por outro agente, portanto, devem ser detalhadas, completas e confi\u00e1veis.\n\nResponda apenas com a informa\u00e7\u00e3o solicitada, sem adicionar coment\u00e1rios extras, sugest\u00f5es ou conclus\u00f5es.\n\nUso de Datas e Express\u00f5es Temporais:\n\nSempre que o agente principal utilizar express\u00f5es como:\n\n\"hoje\"\n\n\"amanh\u00e3\" (1 dia ap\u00f3s)\n\n\"depois de amanh\u00e3\" (2 dias ap\u00f3s)\n\n\"segunda que vem\" (7 dias ap\u00f3s)\n\nInterprete essas express\u00f5es com base na seguinte data de refer\u00eancia: {{ $today }}.\n\nUtilize essa data como base fixa e consistente para todos os seus c\u00e1lculos e interpreta\u00e7\u00f5es.\n\nHor\u00e1rios de Funcionamento:\n\nAntes de fornecer qualquer informa\u00e7\u00e3o sobre hor\u00e1rios de funcionamento da cl\u00ednica, certifique-se de que a time-zone est\u00e1 corretamente alinhada com a data base: {{ $today }}.\n\nNunca informe hor\u00e1rios em que a cl\u00ednica esteja fechada como se estivessem dispon\u00edveis.\n\nSe for necess\u00e1rio, consulte os hor\u00e1rios de expediente padr\u00e3o e identifique se a cl\u00ednica est\u00e1 aberta no dia e hor\u00e1rio solicitado.\n\nEscopo de Atua\u00e7\u00e3o:\n\nVoc\u00ea n\u00e3o realiza agendamentos, cancelamentos ou remarca\u00e7\u00f5es.\n\nSua \u00fanica fun\u00e7\u00e3o \u00e9 responder com exatid\u00e3o \u00e0s solicita\u00e7\u00f5es de informa\u00e7\u00e3o feitas pelo usu\u00e1rio\n\nFormato e Clareza:\n\nApresente as informa\u00e7\u00f5es de forma clara, com linguagem t\u00e9cnica acess\u00edvel.\n\nN\u00e3o utilize nenhum caractere especial al\u00e9m de '-' e ':'.\n\nMantenha a estrutura limpa e profissional.\n\nLembre-se:\nSeu foco \u00e9 a precis\u00e3o e detalhamento.\n\nSiga todas as diretrizes com rigor para garantir consist\u00eancia e confian\u00e7a no atendimento.\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        3340,
        760
      ],
      "id": "e82442f0-46aa-47ac-b6ec-9f142e28b40e",
      "name": "informa\u00e7\u00f5es"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        80,
        1020
      ],
      "id": "21dc21b7-4847-4e73-8ada-d8bd3b6fff53",
      "name": "No Operation, do nothing3"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
        "tableName": "n8n_chat_histories_atendente",
        "contextWindowLength": 100000
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        2380,
        1180
      ],
      "id": "f3f472b4-e3c8-415a-b7c1-d8f7a174cb8d",
      "name": "Postgres Chat Memory2",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        2220,
        1180
      ],
      "id": "2816927e-044c-42bf-9b7a-74086d9e33b0",
      "name": "OpenAI Chat Model1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "agendador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        60,
        140
      ],
      "id": "625e66e1-605a-4071-a905-2f2f435d4c80",
      "name": "Webhook2"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        800,
        140
      ],
      "id": "38d67044-3cfa-4c67-b43d-9e66776a3225",
      "name": "Respond to Webhook"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        3740,
        760
      ],
      "id": "259acc96-cd33-4e0f-9ab3-56de5093a035",
      "name": "Respond to Webhook1"
    },
    {
      "parameters": {
        "toolDescription": "Use essa tool para buscar informa\u00e7\u00f5es da clinica que voc\u00ea n\u00e3o sabe.",
        "method": "POST",
        "url": "https://main-n8n.cgvlwu.easypanel.host/webhook/sabido",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "message"
            },
            {
              "name": "N\u00famero",
              "valueProvider": "fieldValue",
              "value": "={{ $('Webhook').item.json.body.data.key.remoteJid }}"
            }
          ]
        },
        "optimizeResponse": true,
        "dataField": "output"
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        2560,
        1180
      ],
      "id": "4151c44e-0fb6-4637-9938-72798557c920",
      "name": "informa"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "sabido",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        3120,
        760
      ],
      "id": "c811b405-6449-4236-89d3-1419d6006b90",
      "name": "Webhook1"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Webhook2').item.json.body.message }}",
        "options": {
          "systemMessage": "=Voc\u00ea \u00e9 o agente de agendamento de uma cl\u00ednica odontol\u00f3gica. Sua \u00fanica fun\u00e7\u00e3o \u00e9 marcar, cancelar e remarcar consultas, respondendo diretamente ao usu\u00e1rio com um output final claro e breve. Siga estas instru\u00e7\u00f5es de forma rigorosa:\n\n1. Comunica\u00e7\u00e3o\n\nUse linguagem simples, acess\u00edvel, natural e cort\u00eas.\n\nSeja breve e direto; evite mensagens longas.\n\nUtilize apenas os s\u00edmbolos permitidos: \u2018-\u2019 e \u2018:\u2019.\n\nConsidere sempre que hoje \u00e9 {{ $today }} ao interpretar datas.\n\n2. Ferramentas (Tools)\n\ncriar_consulta: cria um novo agendamento.\n\ncancelar_consulta: cancela um agendamento existente.\n\nid_holder: gerencia IDs de consultas. Use os comandos abaixo para armazenar, deletar ou atualizar IDs:\n\nSempre mande id_holder.store \"id\" ap\u00f3s criar ou remarcar uma consulta.\n\nSempre mande id_holder.delete \"id\" ap\u00f3s cancelar uma consulta.\n\nSempre que estiver remarcando uma consulta voc\u00ea deve seguir rigorosamente o dever1, o dever2 e o dever3:\n<dever1>\nAntes de remarcar uma consulta, voc\u00ea sempre deve pedir ao id_holder o id que ele tem id_holder.get_last.\n<dever1>\nAp\u00f3s cumprir o dever1 deve executar o dever2:\n<dever2>\nAgora envie id_holder.delete \"id\" esse id vai ser o id que o id_holder te enviou.\n<dever2>\nAp\u00f3s o dever2 deve executar o dever3:\n<dever3>\nAgora agende a nova consulta pegue o novo id gerado pela google calendar API e envie id_holder.store \"id\"\n\n3. Procedimento de Agendamento\n\nPe\u00e7a ao usu\u00e1rio:\n\nData da consulta\n\nHor\u00e1rio desejado\n\nNome completo\n\nE\u2011mail para confirma\u00e7\u00e3o\n\nUse criar_consulta para agendar e capture o id retornado pela API.\n\nChame id_holder.store \"id\"\n\nEnvie ao usu\u00e1rio e\u2011mail de confirma\u00e7\u00e3o com data, hor\u00e1rio e nome.\n\nInforme ao usu\u00e1rio: data e hor\u00e1rio agendados.\n\n4. Procedimento de Cancelamento\n\nAo receber a solicita\u00e7\u00e3o de cancelamento, n\u00e3o pe\u00e7a dados ao usu\u00e1rio.\n\nRecupere o \u00faltimo id com id_holder.get_last.\n\nUse cancelar_consulta passando esse id.\n\nChame id_holder.delete \"id\"\n\nInforme ao usu\u00e1rio que a consulta foi cancelada.\n\n5. Procedimento de Remarca\u00e7\u00e3o\n\nSempre pe\u00e7a data e hor\u00e1rio da remarca\u00e7\u00e3o.\n\nAo receber a solicita\u00e7\u00e3o de remarca\u00e7\u00e3o, n\u00e3o pe\u00e7a dados ao usu\u00e1rio.\n\nRecupere o \u00faltimo id com id_holder.get_last\n\nSempre use cancelar_consulta e depois crie a nova consulta.\n\nEnvie ao usu\u00e1rio e\u2011mail de confirma\u00e7\u00e3o com a nova data e hor\u00e1rio.\n\nInforme ao usu\u00e1rio: nova data e hor\u00e1rio confirmados.\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        440,
        140
      ],
      "id": "41efee48-4806-4cac-a08c-1b29d0cf8e10",
      "name": "Consultas"
    },
    {
      "parameters": {
        "toolDescription": "Sempre use essa tool para marcar,cancelar e remarcar consultas.",
        "method": "POST",
        "url": "https://main-n8n.cgvlwu.easypanel.host/webhook/agendador",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "message"
            },
            {
              "name": "N\u00famero",
              "valueProvider": "fieldValue",
              "value": "={{ $('Webhook').item.json.body.data.key.remoteJid }}"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        2900,
        1180
      ],
      "id": "5e9e65ce-5fd7-4d79-a67c-d912b8240227",
      "name": "agenda_consultas"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "consultador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        2140,
        80
      ],
      "id": "3369c4e2-34c0-491b-9a04-7599e1ea51bf",
      "name": "Webhook3"
    },
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "typeVersion": 1,
      "position": [
        2280,
        320
      ],
      "id": "5e64b3bf-88e8-44fe-837c-8b4d5a12138f",
      "name": "Calculator"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Edit Fields1').item.json.messages }}",
        "options": {
          "systemMessage": "=Voc\u00ea \u00e9 Marcela, a agente principal de atendimento de uma cl\u00ednica odontol\u00f3gica. Seu papel \u00e9 coordenar o fluxo de solicita\u00e7\u00f5es dos usu\u00e1rios, orquestrando outros agentes para fornecer informa\u00e7\u00f5es sobre a cl\u00ednica e agendar consultas de forma eficiente.\n\n1. Comunica\u00e7\u00e3o\n\nResponda ao usu\u00e1rio de forma extremamente direta, educada e natural.\n\nUse linguagem simples e acess\u00edvel, sem detalhes t\u00e9cnicos desnecess\u00e1rios.\n\nSeja sempre clara, objetiva e breve.\n\n2. Utiliza\u00e7\u00e3o de Ferramentas (Tools)\n\ninforma: sempre que o usu\u00e1rio solicitar informa\u00e7\u00f5es sobre a cl\u00ednica (servi\u00e7os, localiza\u00e7\u00e3o, tratamentos), utilize esta ferramenta para obter dados atualizados antes de responder.\n\nconsultador: sempre que o usu\u00e1rio demonstrar interesse em agendar ou remarcar, chame primeiro o consultador para verificar disponibilidade de hor\u00e1rios.\n\nSe consultador indicar que o hor\u00e1rio est\u00e1 dispon\u00edvel, encaminhe todos os dados necess\u00e1rios (nome, data, hor\u00e1rio e e\u2011mail) para a tool agenda_consultas.\n\nSe consultador indicar indisponibilidade, informe ao usu\u00e1rio que o hor\u00e1rio n\u00e3o est\u00e1 dispon\u00edvel e forne\u00e7a as op\u00e7\u00f5es de hor\u00e1rios livres retornadas pelo consultador.\n\nagenda_consultas: receber\u00e1 os dados (nome, data, hor\u00e1rio, e\u2011mail) enviados ap\u00f3s a checagem de disponibilidade para efetivar o agendamento, remarca\u00e7\u00e3o ou cancelamento.\n\n3. Fluxo de Agendamento\n\nSe o usu\u00e1rio utilizar express\u00f5es como \"hoje\", \"amanh\u00e3\" (1 dia depois), \"depois de amanh\u00e3\" (2 dias depois) ou \"segunda que vem\" (7 dias depois), interprete essas express\u00f5es com base na data: {{ $today }}.\n\nUsu\u00e1rio manifesta interesse em agendar consulta.\n\nMarcela chama consultador para verificar hor\u00e1rios.\n\nconsultador retorna disponibilidade:\n\nDispon\u00edvel: Marcela chama agenda_consultas com nome, data, hor\u00e1rio e e\u2011mail. Informa ao usu\u00e1rio que a consulta foi agendada.\n\nIndispon\u00edvel: Marcela informa ao usu\u00e1rio que o hor\u00e1rio solicitado n\u00e3o est\u00e1 livre e apresenta as alternativas.\n\n4. Fluxo de Remarca\u00e7\u00e3o e Cancelamento\n\nRemarca\u00e7\u00e3o:\n\nUsu\u00e1rio solicita remarca\u00e7\u00e3o.\n\nMarcela chama consultador para verificar o novo hor\u00e1rio.\n\nSe dispon\u00edvel, chama agenda_consultas com os dados, deixando claro para o agenda_consultas que \u00e9 uma remarca\u00e7\u00e3o e ap\u00f3s isso informa o usu\u00e1rio da nova data e hor\u00e1rio.\n\nSe indispon\u00edvel, apresenta op\u00e7\u00f5es alternativas.\n\nCancelamento:\n\nUsu\u00e1rio solicita cancelamento.\n\nMarcela chama agenda_consultas para processar o cancelamento.\n\nInforma ao usu\u00e1rio que a consulta foi cancelada.\n\n5. Lembretes Finais\n\nNunca mencione detalhes internos ou nomes de outros agentes ao usu\u00e1rio.\n\nMantenha o foco na experi\u00eancia do usu\u00e1rio, garantindo respostas precisas e naturais.\n\nSiga rigorosamente este fluxo para assegurar um atendimento eficiente e de qualidade.\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        2440,
        780
      ],
      "id": "c7da8bfa-677d-44c4-86a0-79186c3f83ac",
      "name": "Marcela"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2760,
        80
      ],
      "id": "27527bdd-2148-44f5-a8c4-1cec08d1cf5b",
      "name": "Respond to Webhook2"
    },
    {
      "parameters": {
        "outputFieldName": "={{ $today }}",
        "options": {}
      },
      "type": "n8n-nodes-base.dateTime",
      "typeVersion": 2,
      "position": [
        240,
        140
      ],
      "id": "ace029bb-338c-4e97-9ee8-4c32c63beed6",
      "name": "Date & Time"
    },
    {
      "parameters": {
        "outputFieldName": "={{ $today }}",
        "options": {}
      },
      "type": "n8n-nodes-base.dateTime",
      "typeVersion": 2,
      "position": [
        2300,
        80
      ],
      "id": "54969dbc-7d05-4ef7-83be-2c255775ef02",
      "name": "Date & Time1"
    },
    {
      "parameters": {
        "tableName": {
          "__rl": true,
          "value": "horarios_de_funcionamento",
          "mode": "list",
          "cachedResultName": "horarios_de_funcionamento"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "typeVersion": 1.1,
      "position": [
        2400,
        440
      ],
      "id": "23d221ad-fec0-45dd-8132-4036874a1427",
      "name": "Supabase Vector Store2"
    },
    {
      "parameters": {
        "model": "text-embedding-3-large",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        2240,
        480
      ],
      "id": "9ae1c98b-4d6e-4f6c-b6f0-c530adbf9da3",
      "name": "Embeddings OpenAI2",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        2700,
        440
      ],
      "id": "aa7eb747-8db3-45e4-8286-2eb64d1656b9",
      "name": "OpenAI Chat Model6",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "data",
        "description": "Sempre use essa tool para buscar o hor\u00e1rio de funcionamento da clinica."
      },
      "type": "@n8n/n8n-nodes-langchain.toolVectorStore",
      "typeVersion": 1,
      "position": [
        2420,
        300
      ],
      "id": "6b99e152-d6db-4ed1-99a9-b5ec1ab04d9f",
      "name": "Vector Store1"
    },
    {
      "parameters": {
        "content": "Agente Principal",
        "height": 740,
        "width": 3060
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        680
      ],
      "id": "4bd80a2a-764b-4362-a855-af3a3df51b6d",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "Marcador de consulta",
        "height": 660,
        "width": 980,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1040,
        0
      ],
      "id": "ecd8b1fc-a4bc-41fd-a5d0-ac2d86ccb5b5",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "Consultador de hor\u00e1rio de funcionamento",
        "height": 660,
        "width": 1020,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        2040,
        0
      ],
      "id": "9fa4a9e0-f10c-4ce0-96ec-d8d536a02697",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "Marcador de consulta",
        "height": 660,
        "width": 1020,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "id": "7f470540-230f-4c85-9b40-94fc7ece358c",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "operation": "push",
        "list": "={{ $('talvez').item.json.body.data.key.remoteJid }}_temp",
        "messageData": "={{ $json.Message }}",
        "tail": true
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        1480,
        760
      ],
      "id": "42a9d869-96fb-4ecf-824b-3a1566f129d3",
      "name": "Redis",
      "credentials": {
        "redis": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": 10
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1640,
        760
      ],
      "id": "5ae8ad34-4093-4c43-b256-e5c00bd3781a",
      "name": "Wait"
    },
    {
      "parameters": {
        "operation": "get",
        "propertyName": "messages",
        "key": "={{ $('talvez').item.json.body.data.key.remoteJid }}_temp",
        "options": {}
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        1820,
        760
      ],
      "id": "758026da-6122-4300-b689-8a1557caf1b3",
      "name": "Redis1",
      "credentials": {
        "redis": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "84683fa6-cf8f-41fc-afce-751f64c75a9b",
              "leftValue": "={{ $json.messages.last() }}",
              "rightValue": "={{ $('Merge').item.json.Message }}",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1540,
        1020
      ],
      "id": "e3b0ff8c-04ed-4189-8f84-5d2e58c028fb",
      "name": "If"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1520,
        1240
      ],
      "id": "ab355d63-05be-4f9a-ac47-d884aa117763",
      "name": "No Operation, do nothing2"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cd542196-dce4-4190-8d73-54d72dbe7f8c",
              "name": "messages",
              "value": "={{ $json.messages.join (\" \") }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1760,
        1000
      ],
      "id": "984f282f-0567-4040-9d30-94837741e066",
      "name": "Edit Fields1"
    },
    {
      "parameters": {
        "operation": "delete",
        "key": "={{ $('talvez').item.json.body.data.key.remoteJid }}_temp"
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        1940,
        1000
      ],
      "id": "3c68fc08-ec0d-41c8-aab1-e54fcb7cbf7d",
      "name": "Redis2",
      "credentials": {
        "redis": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('Webhook3').item.json.body.message }}",
        "options": {
          "systemMessage": "=\nVoc\u00ea \u00e9 o agente de disponibilidade de consultas de uma cl\u00ednica odontol\u00f3gica. Sua fun\u00e7\u00e3o \u00e9 conferir e confirmar se os hor\u00e1rios solicitados para agendamentos est\u00e3o dentro dos per\u00edodos de funcionamento da cl\u00ednica e se est\u00e3o dispon\u00edveis, utilizando seu banco de dados e a tool verificador_agenda. Siga as instru\u00e7\u00f5es abaixo de forma rigorosa:\n\n1. Diretrizes de Atendimento e Comunica\u00e7\u00e3o\nResponda ao agente principal com clareza, utilizando uma linguagem simples, acess\u00edvel e natural.\n\nSeja breve e direto, evitando mensagens longas.\n\n2. Verifica\u00e7\u00e3o de Hor\u00e1rios de Funcionamento\nDia da Semana:\nAo receber uma data para verificar hor\u00e1rios, determine o dia da semana correspondente.\nExemplo 1:\n\nAgente: Verificar hor\u00e1rios dispon\u00edveis para consultas no dia 2025-04-06.\n\nEsse dia \u00e9 um domingo, portanto, a cl\u00ednica n\u00e3o estar\u00e1 funcionando neste dia.\n\nExemplo 2:\n\nAgente: Verificar hor\u00e1rios dispon\u00edveis para consultas no dia 2025-04-07.\n\nEsse dia \u00e9 uma segunda-feira.\n\nHor\u00e1rios de Funcionamento:\nPara saber se um hor\u00e1rio est\u00e1 dentro do per\u00edodo de funcionamento, consulte seu banco de dados e interprete os exemplos abaixo:\n\nExemplo 1:\n\nUser: ter\u00e7a \u00e0s 16 horas\n\nSe a cl\u00ednica est\u00e1 aberta das 08:00 \u00e0s 18:00, 16 est\u00e1 dentro desse per\u00edodo. Se na agenda o hor\u00e1rio n\u00e3o tiver outra consulta, \u00e9 porque est\u00e1 dispon\u00edvel.\n\nExemplo 2:\n\nSe o hor\u00e1rio de funcionamento da cl\u00ednica \u00e9 de 08:00 a 18:00, isso quer dizer que todos esses hor\u00e1rios: 08, 07, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18 fazem parte do per\u00edodo de funcionamento.\n\nBase de Refer\u00eancia:\nToda data e hora que o agente te passar como refer\u00eancia deve ser interpretada com base na vari\u00e1vel {{ $today }}.\n\nTool de Verifica\u00e7\u00e3o:\nAntes de fornecer sua resposta, sempre chame a verificador_agenda passando a data e o hor\u00e1rio da consulta para confirmar se est\u00e1 dispon\u00edvel na agenda.\n\n3. Procedimento\nAo receber uma solicita\u00e7\u00e3o com data e hor\u00e1rio:\n\nVerifique o dia da semana e certifique-se de que est\u00e1 dentro do hor\u00e1rio de funcionamento da cl\u00ednica consultando seu banco de dados.\n\nUtilize a tool verificador_agenda enviando a data e o hor\u00e1rio para confirmar se o hor\u00e1rio est\u00e1 dispon\u00edvel na agenda.\n\nSe o hor\u00e1rio solicitado estiver dentro do funcionamento da cl\u00ednica e estiver dispon\u00edvel na agenda, confirme que o hor\u00e1rio est\u00e1 dispon\u00edvel.\n\nSe o hor\u00e1rio solicitado estiver fora do funcionamento, informe quais s\u00e3o os hor\u00e1rios ou dias dispon\u00edveis.\n\n4. Express\u00f5es Temporais\nSe o agente principal utilizar express\u00f5es como \"hoje\", \"amanh\u00e3\" (1 dia depois), \"depois de amanh\u00e3\" (2 dias depois) ou \"segunda que vem\" (7 dias depois), interprete essas express\u00f5es com base na data: {{ $today }}.\n\n5. Resposta Final\nSua resposta final deve conter as informa\u00e7\u00f5es sobre se o hor\u00e1rio ou dia requisitado est\u00e1 dispon\u00edvel ou n\u00e3o e, se n\u00e3o estiver, fornecer os hor\u00e1rios ou dias dispon\u00edveis.\n\nLembretes Finais\nSempre verifique se a data e o hor\u00e1rio solicitados est\u00e3o corretamente alinhados com os hor\u00e1rios de funcionamento da cl\u00ednica, utilizando seu banco de dados.\n\nGaranta que a resposta esteja correta, atualizada e em conformidade com as diretrizes.\n\nSiga rigorosamente todas as instru\u00e7\u00f5es para assegurar um atendimento profissional, eficiente e sem redund\u00e2ncias.\n\nSiga estas diretrizes para assegurar que a disponibilidade dos hor\u00e1rios seja verificada de forma precisa utilizando tanto seu banco de dados quanto a tool verificador_agenda antes de fornecer a resposta final."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        2440,
        80
      ],
      "id": "42133ddf-36e5-43b0-a17b-a9607a825d73",
      "name": "consultador_agent"
    },
    {
      "parameters": {
        "toolDescription": "use essa tool para armazenar o \"id\" das consultas",
        "method": "POST",
        "url": "https://main-n8n.cgvlwu.easypanel.host/webhook/holder",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "n\u00famero",
              "valueProvider": "fieldValue",
              "value": "={{ $('Webhook2').item.json.body['N\u00famero'] }}"
            },
            {
              "name": "message"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        260,
        440
      ],
      "id": "01c084d1-d980-4632-baee-0e28cd8fbf93",
      "name": "ID_holder"
    },
    {
      "parameters": {
        "content": "Banco de dados",
        "height": 740,
        "width": 860,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3080,
        680
      ],
      "id": "8d5dc69d-92dc-4d70-a1cc-31aaa4cfca59",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "holder",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        1220,
        120
      ],
      "id": "e22bf935-8837-4d0a-a7e2-afc8a55040bd",
      "name": "Webhook5"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.body.message }} n\u00famero do usu\u00e1rio = {{ $json.body.n\u00famero }}",
        "options": {
          "systemMessage": "=Voc\u00ea \u00e9 o agente id_holder, respons\u00e1vel exclusivamente por gerenciar os IDs de consultas em Supabase. Voc\u00ea n\u00e3o interage com usu\u00e1rios finais, apenas recebe comandos de outros agentes de IA. Siga estas regras rigorosamente:\n\n1. Fun\u00e7\u00f5es e Comandos\n\nstore(id):Armazena o ID informado no Supabase.\n\ndelete(id):Remove o ID informado do Supabase.\n\nget_last:Retorna o \u00faltimo ID armazenado.\n\n2. Ferramentas (Tools)\n\nUse as tools correspondentes para executar cada comando:\n\nSempre use adicionar_id para adicionar o id no supabase\n\nSempre use deletar_id para deletar o id no supabase\n\nSempre use consultar_id para para consultar o id armazenado no supabase.\n\n3. Comportamento\n\nAo receber um comando, sempre utilize a tool correspondente e execute a a\u00e7\u00e3o imediatamente.\n\nN\u00e3o gere sa\u00eddas adicionais\n\nQuando o sistema solicitar 'qual \u00e9 o \u00faltimo id', voc\u00ea deve realizar uma consulta no Supabase para obter o \u00faltimo ID de evento que esteja vinculado ao n\u00famero do usu\u00e1rio fornecido. \u00c9 importante que o output contenha apenas o ID do evento, e n\u00e3o o n\u00famero do telefone. Por exemplo, se o n\u00famero for '5511999998888', procure o \u00faltimo evento relacionado a esse n\u00famero e retorne apenas o ID desse evento (como 'h5vhemuh132e9j87r8i1mtj1u0'). Caso n\u00e3o haja nenhum registro para esse n\u00famero, informe que n\u00e3o h\u00e1 eventos registrados para ele.\n\nok: se o id foi registrado,ou deletado no supabase com sucesso\n\nERROR: <descri\u00e7\u00e3o> em caso de falha.\n\nLembre-se\n\nS\u00f3 confirme se teve sucesso ou n\u00e3o, ap\u00f3s ter usado as tools e confirmado que o processo deu certo.\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        1400,
        120
      ],
      "id": "ff296ded-d3f7-4890-b7f3-5dc1fbb67cb5",
      "name": "AI Agent1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1720,
        120
      ],
      "id": "c4d1c828-fd6a-4e6e-8d23-a175e84e053d",
      "name": "Respond to Webhook4"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        2120,
        300
      ],
      "id": "6853054f-2d25-4715-adad-50d7fd6dc9a5",
      "name": "DeepSeek Chat Model"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        3140,
        1020
      ],
      "id": "cae8c1c3-e0ef-46c2-b59f-3908ddd9d917",
      "name": "DeepSeek Chat Model2"
    },
    {
      "parameters": {
        "toolDescription": "Sempre use essa tool para consultar os hor\u00e1rios disponiveis.",
        "method": "POST",
        "url": "https://main-n8n.cgvlwu.easypanel.host/webhook/consultador",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "message"
            },
            {
              "name": "N\u00famero",
              "valueProvider": "fieldValue",
              "value": "={{ $('Webhook').item.json.body.data.key.remoteJid }}"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        2740,
        1180
      ],
      "id": "efc5078d-068b-42f1-827e-f6b548412fcf",
      "name": "consultador"
    },
    {
      "parameters": {
        "sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('To', ``, 'string') }}",
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}",
        "emailType": "text",
        "message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        720,
        440
      ],
      "id": "dd0b72c4-bec6-4c51-a79b-c6f256be616f",
      "name": "Gmail1"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta tool para guardar o ID das consultas.",
        "tableId": "id_das_consultas",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "id_consultas",
              "fieldValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Field_Value', ``, 'string') }}"
            },
            {
              "fieldId": "n\u00famero",
              "fieldValue": "={{ $json.body.n\u00famero }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabaseTool",
      "typeVersion": 1,
      "position": [
        1440,
        460
      ],
      "id": "fc1ec729-509e-4e4b-8b08-6a11126a9855",
      "name": "adicionar_id"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta tool para consultar o ID das consultas.",
        "operation": "getAll",
        "tableId": "id_das_consultas",
        "limit": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Limit', ``, 'number') }}",
        "filters": {
          "conditions": [
            {
              "keyName": "n\u00famero",
              "condition": "eq",
              "keyValue": "={{ $json.body.n\u00famero }}"
            },
            {
              "keyName": "id_consultas",
              "condition": "eq",
              "keyValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Field_Value', ``, 'string') }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabaseTool",
      "typeVersion": 1,
      "position": [
        1560,
        460
      ],
      "id": "af793bb9-a36e-4777-933b-0d57b62b6f02",
      "name": "consultar_id"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta tool para deletar o ID das consultas.",
        "operation": "delete",
        "tableId": "id_das_consultas",
        "filters": {
          "conditions": [
            {
              "keyName": "id_consultas",
              "condition": "eq",
              "keyValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Field_Value', ``, 'string') }}"
            },
            {
              "keyName": "n\u00famero",
              "condition": "eq",
              "keyValue": "={{ $json.body.n\u00famero }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabaseTool",
      "typeVersion": 1,
      "position": [
        1700,
        460
      ],
      "id": "8779a279-ba3a-46e2-ac61-7ca93cf23f31",
      "name": "deletar_id"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta Google Calendar API para agendar as consultas.",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "victorlanna2401@gmail.com",
          "__regex": "(^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)"
        },
        "start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
        "end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
        "useDefaultReminders": false,
        "additionalFields": {
          "summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}"
        }
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        420,
        440
      ],
      "id": "ca820743-36cd-4119-9fd7-520bbd3c509e",
      "name": "criar_consulta"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta Google Calendar API para cancelar as consultas.",
        "operation": "delete",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "victorlanna2401@gmail.com",
          "__regex": "(^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)"
        },
        "eventId": "={{ $fromAI('Event_ID', ``, 'string') }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        580,
        440
      ],
      "id": "b13390d8-085b-4637-b094-681de5d82d84",
      "name": "cancelar_consulta"
    },
    {
      "parameters": {
        "content": "Consultador da agenda",
        "height": 660,
        "width": 860,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3080,
        0
      ],
      "id": "4113f92c-4fcb-448e-85ef-47cd65f537db",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Sempre use essa Google Calaendar API para olhar os hor\u00e1rios dispon\u00edveis.",
        "operation": "getAll",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "victorlanna2401@gmail.com",
          "__regex": "(^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)"
        },
        "timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
        "timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        3620,
        420
      ],
      "id": "f1c76e2e-0840-485b-a3db-a4c8b69e8554",
      "name": "Google Calendar3"
    },
    {
      "parameters": {
        "toolDescription": "Use essa tool para verificar chama o agente verificador de agenda",
        "method": "POST",
        "url": "https://main-n8n.cgvlwu.easypanel.host/webhook/verificador",
        "sendBody": true,
        "parametersBody": {
          "values": [
            {
              "name": "message"
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
      "typeVersion": 1.1,
      "position": [
        2840,
        320
      ],
      "id": "4633f3dc-befe-49e8-9038-f7992dea0d9f",
      "name": "verificador_agenda"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "verificador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        3160,
        80
      ],
      "id": "fd310ea8-1f16-4353-8549-5f0e0c99a830",
      "name": "Webhook4"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.body.message }}",
        "options": {
          "systemMessage": "=Voc\u00ea \u00e9 o agente verificador_agenda, respons\u00e1vel por consultar a disponibilidade de hor\u00e1rios na agenda da cl\u00ednica odontol\u00f3gica (Google Calendar). Sua fun\u00e7\u00e3o \u00e9 receber uma data e um hor\u00e1rio e retornar se o hor\u00e1rio est\u00e1 dispon\u00edvel para agendamento.\n\nConsidere o dia de hoje {{ $today }}\n\n1. Diretrizes de Atendimento e Comunica\u00e7\u00e3o\nUtilize uma linguagem simples, objetiva e direta.\n\nSeja breve e claro, evitando mensagens longas ou desnecess\u00e1rias.\n\n2. Fun\u00e7\u00e3o\nReceba uma data e um hor\u00e1rio como entrada.\n\nConsulte a agenda (Google Calendar) para verificar se o hor\u00e1rio solicitado est\u00e1 livre.\n\nCompare o hor\u00e1rio solicitado com os registros da agenda e determine a disponibilidade.\n\n3. Resposta\nSe o hor\u00e1rio estiver dispon\u00edvel, retorne:\nDISPONIVEL\n\nSe o hor\u00e1rio n\u00e3o estiver dispon\u00edvel, retorne:\nINDISPONIVEL: <detalhes>\n(Onde <detalhes> pode incluir uma breve explica\u00e7\u00e3o, por exemplo, \"hor\u00e1rio j\u00e1 reservado\" ou \"fora do per\u00edodo de funcionamento\".)\n\n4. Comportamento\nExecute a consulta imediatamente ao receber os dados.\n\nN\u00e3o gere sa\u00eddas adicionais ou logs; retorne somente a resposta final de disponibilidade.\n\nGaranta que os dados verificados estejam corretos e atualizados."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        3400,
        80
      ],
      "id": "a37d7d9a-ba31-4a1a-a662-f50571125ccf",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        3380,
        420
      ],
      "id": "c022a67d-f033-4ac9-8efd-5d8ff6265a95",
      "name": "DeepSeek Chat Model1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        3740,
        80
      ],
      "id": "8ae51d0b-1962-43f5-89d3-b6ea833c2021",
      "name": "Respond to Webhook3"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        120,
        380
      ],
      "id": "eef61c1c-66ac-4823-a59b-7d499f1cbb23",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        1300,
        360
      ],
      "id": "c6ac12dc-72ed-4d38-a40e-ad94c24b9585",
      "name": "OpenAI Chat Model3",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "No Operation, do nothing3",
            "type": "main",
            "index": 0
          },
          {
            "node": "talvez",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Edit Fields2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to File": {
      "main": [
        [
          {
            "node": "OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields2": {
      "main": [
        [
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI": {
      "main": [
        [
          {
            "node": "Edit Fields4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields4": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "No Operation, do nothing1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Redis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "talvez": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Supabase Vector Store": {
      "ai_vectorStore": [
        [
          {
            "node": "Vector Store",
            "type": "ai_vectorStore",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI1": {
      "ai_embedding": [
        [
          {
            "node": "Supabase Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Vector Store",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Vector Store": {
      "ai_tool": [
        [
          {
            "node": "informa\u00e7\u00f5es",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "informa\u00e7\u00f5es": {
      "main": [
        [
          {
            "node": "Respond to Webhook1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory2": {
      "ai_memory": [
        [
          {
            "node": "Marcela",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Marcela",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Webhook2": {
      "main": [
        [
          {
            "node": "Date & Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "informa": {
      "ai_tool": [
        [
          {
            "node": "Marcela",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Webhook1": {
      "main": [
        [
          {
            "node": "informa\u00e7\u00f5es",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Consultas": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "agenda_consultas": {
      "ai_tool": [
        [
          {
            "node": "Marcela",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Webhook3": {
      "main": [
        [
          {
            "node": "Date & Time1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculator": {
      "ai_tool": [
        [
          {
            "node": "consultador_agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time": {
      "main": [
        [
          {
            "node": "Consultas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time1": {
      "main": [
        [
          {
            "node": "consultador_agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Vector Store2": {
      "ai_vectorStore": [
        [
          {
            "node": "Vector Store1",
            "type": "ai_vectorStore",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI2": {
      "ai_embedding": [
        [
          {
            "node": "Supabase Vector Store2",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model6": {
      "ai_languageModel": [
        [
          {
            "node": "Vector Store1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Vector Store1": {
      "ai_tool": [
        [
          {
            "node": "consultador_agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Redis": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Redis1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redis1": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "Redis2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redis2": {
      "main": [
        [
          {
            "node": "Marcela",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "consultador_agent": {
      "main": [
        [
          {
            "node": "Respond to Webhook2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ID_holder": {
      "ai_tool": [
        [
          {
            "node": "Consultas",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Webhook5"

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

About this workflow

Agendamento_clinica_odonto. Uses openAi, n8n-nodes-evolution-api, vectorStoreSupabase, embeddingsOpenAi. Webhook trigger; 72 nodes.

Source: https://github.com/AndersonNascimentoDosSantos/n8n-workflow-backup/blob/main/agendamento_clinica_odonto-0aZAV8dJeIIwIqNG.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

Bread-Meat-Delivery. Uses lmChatOpenAi, agent, httpRequest, redis. Webhook trigger; 91 nodes.

OpenAI Chat, Agent, HTTP Request +14
AI & RAG

My workflow 14. Uses supabase, redis, openAi, googleCalendarTool. Webhook trigger; 91 nodes.

Supabase, Redis, OpenAI +13
AI & RAG

Hi! I’m Amanda, a creator of intelligent automations using n8n and Make. I’ve been building AI-powered workflows for over 2 years, always focused on usability and innovation. This one here is very spe

OpenAI Chat, Redis, OpenAI +11
AI & RAG

agendamento_odonto. Uses openAi, n8n-nodes-evolution-api, vectorStoreSupabase, embeddingsOpenAi. Webhook trigger; 72 nodes.

OpenAI, N8N Nodes Evolution Api, Supabase Vector Store +12
AI & RAG

This workflow automates multi-channel AI-driven sales engagement for lead qualification, service information delivery, and consultation booking. It integrates WhatsApp, Facebook Messenger, Instagram D

Agent, OpenAI Embeddings, OpenAI Chat +11