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 →
{
"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.
evolutionApigmailOAuth2googleCalendarOAuth2ApipostgresredissupabaseApi
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 →
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_clinica_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