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 →
{
"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.
openAiApipostgresredis
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Bread-Meat-Delivery. Uses lmChatOpenAi, agent, httpRequest, redis. Webhook trigger; 91 nodes.
My workflow 14. Uses supabase, redis, openAi, googleCalendarTool. Webhook trigger; 91 nodes.
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
agendamento_odonto. Uses openAi, n8n-nodes-evolution-api, vectorStoreSupabase, embeddingsOpenAi. Webhook trigger; 72 nodes.
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