AutomationFlowsAI & RAG › Agendamento Odonto

Agendamento Odonto

agendamento_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
{
  "createdAt": "2025-04-09T00:51:20.336Z",
  "updatedAt": "2025-04-09T01:18:17.533Z",
  "id": "j2jDQV4SaYdaC3wg",
  "name": "agendamento_odonto",
  "active": false,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "minas",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        80,
        780
      ],
      "id": "afd1595c-dbde-4849-a852-70a80f447775",
      "name": "Webhook"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        340,
        1020
      ],
      "id": "35cb486d-d412-4f5b-8a95-dfec6c200e2a",
      "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": "7193f024-0c3d-46a8-ba7a-4fc04dd06fa9",
      "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": "d7266348-a4df-47d6-96a2-5ec631335e14",
      "name": "Convert to File"
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        1040,
        760
      ],
      "id": "06ec64ee-cfd3-475c-ad12-7e9741196d28",
      "name": "OpenAI"
    },
    {
      "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": "d86dacdc-6fdd-4b39-87d0-9a93be247b16",
      "name": "Edit Fields2"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.1,
      "position": [
        1300,
        920
      ],
      "id": "1fb53738-553c-4714-9b81-1c6d73575607",
      "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": "25878405-60b5-4fb1-af28-0243243e0680",
      "name": "Edit Fields4"
    },
    {
      "parameters": {
        "resource": "messages-api",
        "instanceName": "teste",
        "remoteJid": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
        "messageText": "={{ $json.output }}",
        "options_message": {}
      },
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "typeVersion": 1,
      "position": [
        2860,
        780
      ],
      "id": "58cadcad-af39-4a6d-8a54-00c787d7e78e",
      "name": "Evolution API1",
      "credentials": {
        "evolutionApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1260,
        1240
      ],
      "id": "01cbaf14-3bd3-4110-ac92-8a7a2dd29bd8",
      "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": "0a0264b9-c170-4a76-9d19-936c6cd9e0e8",
      "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": "93fb51d9-af0d-4490-9407-2542e364d687",
      "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": "695331af-8b29-45b4-8003-ab818b73709a",
      "name": "Supabase Vector Store",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "text-embedding-3-large",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        3200,
        1240
      ],
      "id": "255fb504-a967-47f6-a596-ebd3dfde8996",
      "name": "Embeddings OpenAI1"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        3700,
        1240
      ],
      "id": "e9c336df-53f5-4185-accd-5d68d87655a9",
      "name": "OpenAI Chat Model2"
    },
    {
      "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": "9f6165ff-9bfc-4902-a291-cd78f5e1e564",
      "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": "9c316b92-14bc-43e7-97bf-bdb291130b5a",
      "name": "informa\u00e7\u00f5es"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        80,
        1020
      ],
      "id": "8fd9c9cd-64da-46b9-bf03-d59641ab22f1",
      "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": "f93b041d-7215-4e42-bafa-fde35bffb949",
      "name": "Postgres Chat Memory2",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        2220,
        1180
      ],
      "id": "3ba705fc-12f8-4951-9982-c6dbc7c29bdf",
      "name": "OpenAI Chat Model1"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "agendador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        60,
        140
      ],
      "id": "66ddc1ad-3ff5-49be-b7ed-8c6fe9cd2d58",
      "name": "Webhook2"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        800,
        140
      ],
      "id": "88f53332-ee45-4c5e-9e31-4f12b7664786",
      "name": "Respond to Webhook"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        3740,
        760
      ],
      "id": "3f90175b-c347-4aa7-bffd-5f3ffde8a1c9",
      "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": "884a76ac-9eef-447f-a4ed-2a2705fd2e39",
      "name": "informa"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "sabido",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        3120,
        760
      ],
      "id": "3d22a9aa-f1cb-4408-9f03-b54c4660a637",
      "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": "6bbe1baf-a804-4de8-9065-02cd9369a606",
      "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": "7dbda9ef-66d0-497f-9238-b521e78a68f1",
      "name": "agenda_consultas"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "consultador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        2140,
        80
      ],
      "id": "fb586818-8530-473f-bdb5-b0c901e73010",
      "name": "Webhook3"
    },
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "typeVersion": 1,
      "position": [
        2280,
        320
      ],
      "id": "dc1cd03e-52f3-41e4-ad8a-306298b0379b",
      "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": "baa891a1-9833-4f4c-a2c6-0bb53c9a1bce",
      "name": "Marcela"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2760,
        80
      ],
      "id": "6f472c2d-feb5-4094-9a99-f60f29358214",
      "name": "Respond to Webhook2"
    },
    {
      "parameters": {
        "outputFieldName": "={{ $today }}",
        "options": {}
      },
      "type": "n8n-nodes-base.dateTime",
      "typeVersion": 2,
      "position": [
        240,
        140
      ],
      "id": "fb826715-78f4-4372-b6f3-424719acd507",
      "name": "Date & Time"
    },
    {
      "parameters": {
        "outputFieldName": "={{ $today }}",
        "options": {}
      },
      "type": "n8n-nodes-base.dateTime",
      "typeVersion": 2,
      "position": [
        2300,
        80
      ],
      "id": "1cd76dd3-6a80-4c14-9b7b-76907800abff",
      "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": "af94637b-83b0-44e2-94e7-7c47c3614e4e",
      "name": "Supabase Vector Store2"
    },
    {
      "parameters": {
        "model": "text-embedding-3-large",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        2240,
        480
      ],
      "id": "4b41acfa-7f4e-474d-8b17-8b2ea95cb800",
      "name": "Embeddings OpenAI2"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        2700,
        440
      ],
      "id": "b804850f-abb5-4253-9302-dce4bff410de",
      "name": "OpenAI Chat Model6"
    },
    {
      "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": "9e8fcc08-2f7c-4d12-8349-bc78d624f98e",
      "name": "Vector Store1"
    },
    {
      "parameters": {
        "content": "Agente Principal",
        "height": 740,
        "width": 3060
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        680
      ],
      "id": "82f0baae-640e-4a17-b60e-a860391e186e",
      "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": "e58ed9b4-2037-4e16-996f-6a45516319d0",
      "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": "f920c60c-61fe-4d3f-a3e2-c1878ca841a5",
      "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": "9bc93c91-5eb4-4225-a125-4bc8ebcd6eb9",
      "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": "01c94ba0-1cf1-41a5-9f91-a3f9b161d4da",
      "name": "Redis",
      "credentials": {
        "redis": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": 10
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1640,
        760
      ],
      "id": "ffe86e1b-da2e-4b1e-94b1-b36a90eaf150",
      "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": "a4978a44-9fff-4932-8bdc-f9d92ebb617d",
      "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": "e1f67854-0a20-49b7-89dc-d6b7bed9d1be",
      "name": "If"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1520,
        1240
      ],
      "id": "a348c32e-5701-44b0-99eb-4327dc8c4df0",
      "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": "aa70d6c5-cb4e-437e-a0a7-32d517afa37a",
      "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": "2168c66d-dd11-46e8-bd1d-1cf12c675363",
      "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": "673fe8d8-eecf-438a-8681-fa00473aabf7",
      "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": "51e8a7a6-7090-47e7-9f7b-0259cf5ad21e",
      "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": "5437cdc5-ff52-4ec5-bcb1-877593ff1615",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "holder",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        1220,
        120
      ],
      "id": "ee77fae9-daaa-4927-a079-abc252d2087d",
      "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": "220c2023-3a21-46a8-805e-d5249ebe3e8d",
      "name": "AI Agent1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1720,
        120
      ],
      "id": "b2564be7-ade8-49b1-b52d-67c07509eda7",
      "name": "Respond to Webhook4"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        2100,
        340
      ],
      "id": "65abd098-98cc-4e7d-8f55-9fce8319ac09",
      "name": "DeepSeek Chat Model"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        3140,
        1020
      ],
      "id": "ae4c26cd-aa96-48f2-9820-0440265a9093",
      "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": "2d34d883-5f41-4abb-8d17-4d971f197ded",
      "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": "db33ccbc-0b07-4547-9588-780deaae0239",
      "name": "Gmail1",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "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": "f695227e-e1c4-4172-bcb1-3d1865e7e2b2",
      "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": "7e9a5b4e-44e3-4edd-b329-8ac75a6db11d",
      "name": "consultar_id",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "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": "63c91ef4-46e8-4764-b296-6ab11a28f24b",
      "name": "deletar_id"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta Google Calendar API para agendar as consultas.",
        "calendar": {
          "__rl": true,
          "value": "06303b006f3edc011a434ed227494cbff11d2fd4b2593530747e0e8461113ddf@group.calendar.google.com",
          "mode": "list",
          "cachedResultName": "Agendamento Odonto"
        },
        "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": "b5f2cb70-9169-4f05-a9b8-d19f96ed1941",
      "name": "criar_consulta",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Use esta Google Calendar API para cancelar as consultas.",
        "operation": "delete",
        "calendar": {
          "__rl": true,
          "value": "06303b006f3edc011a434ed227494cbff11d2fd4b2593530747e0e8461113ddf@group.calendar.google.com",
          "mode": "list",
          "cachedResultName": "Agendamento Odonto"
        },
        "eventId": "={{ $fromAI('Event_ID', ``, 'string') }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        580,
        440
      ],
      "id": "1588c9ee-a30c-480d-b90e-74624c0cc1d5",
      "name": "cancelar_consulta",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "Consultador da agenda",
        "height": 660,
        "width": 860,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3080,
        0
      ],
      "id": "9dc44e58-c7a3-4ced-a6e2-4d9a2d69cae0",
      "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,
          "value": "06303b006f3edc011a434ed227494cbff11d2fd4b2593530747e0e8461113ddf@group.calendar.google.com",
          "mode": "list",
          "cachedResultName": "Agendamento Odonto"
        },
        "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": "66944674-5630-443a-a425-0ce79bb3a822",
      "name": "Google Calendar3",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "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": "a68b17ed-3c04-4614-9afb-8095b268b0b3",
      "name": "verificador_agenda"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "verificador",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        3160,
        80
      ],
      "id": "83152037-0189-46ae-919f-24dfca3f1c66",
      "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": "e9e5657e-61ca-449f-b59d-db3f3dd51bce",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        3380,
        420
      ],
      "id": "5a41c865-c062-4624-932e-3964d9c340dc",
      "name": "DeepSeek Chat Model1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        3740,
        80
      ],
      "id": "41f3746d-2f18-4b67-b35f-10f832a1cdc8",
      "name": "Respond to Webhook3"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o",
          "mode": "list",
          "cachedResultName": "gpt-4o"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        120,
        380
      ],
      "id": "8f3fc25f-6523-4e03-8264-f4e72f208d02",
      "name": "OpenAI Chat Model"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        1300,
        360
      ],
      "id": "52792d9b-8a0b-414c-b63c-7ea6ab93513e",
      "name": "OpenAI Chat Model3"
    }
  ],
  "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
          }
        ]
      ]
    },
    "Marcela": {
      "main": [
        [
          {
            "node": "Evolution API1",
            "type": "main",
            "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": {
    

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_odonto. Uses openAi, n8n-nodes-evolution-api, vectorStoreSupabase, embeddingsOpenAi. Webhook trigger; 72 nodes.

Source: https://github.com/AndersonNascimentoDosSantos/n8n-workflow-backup/blob/main/agendamento_odonto-j2jDQV4SaYdaC3wg.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_clinica_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