This workflow follows the Agent → Chainllm recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "my-secretary",
"nodes": [
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "8ca54eae-15d1-49d3-af33-7a6e5d17b833",
"leftValue": "={{ $json.tipo }}",
"rightValue": "incoming",
"operator": {
"type": "string",
"operation": "equals"
}
},
{
"id": "82912d66-ee4b-439c-9d55-96090bc6ba62",
"leftValue": "={{ $json.etiquetas }}",
"rightValue": "agente-off",
"operator": {
"type": "array",
"operation": "notContains",
"rightType": "any"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.filter",
"typeVersion": 2.2,
"position": [
2800,
740
],
"id": "c2e951f8-7275-4bcb-b198-dbd5cce24a33",
"name": "Mensagem chegando?"
},
{
"parameters": {
"httpMethod": "POST",
"path": "my-secretary-message",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
2240,
740
],
"id": "285b692e-93dc-4756-90a1-05d20fa53d32",
"name": "Mensagem recebida"
},
{
"parameters": {
"jsCode": "const ultima_mensagem_da_fila = $input.last()\nconst mensagem_do_workflow = $('Info').first()\n\nif (ultima_mensagem_da_fila.json.id_mensagem !== mensagem_do_workflow.json.id_mensagem) {\n // Mensagem encavalada, para o workflow\n return [];\n}\n\n// Pass-through da fila de mensagens\nreturn $input.all();"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3980,
740
],
"id": "04bd2812-8898-41e6-a618-d0c66681cce9",
"name": "Mensagem encavalada?"
},
{
"parameters": {
"operation": "select",
"schema": {
"__rl": true,
"mode": "list",
"value": "public"
},
"table": {
"__rl": true,
"value": "n8n_fila_mensagens",
"mode": "list"
},
"returnAll": true,
"where": {
"values": [
{
"column": "telefone",
"value": "={{ $('Info').item.json.telefone }}"
}
]
},
"sort": {
"values": [
{
"column": "timestamp"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.6,
"position": [
3760,
740
],
"id": "3ac0ef12-0bdb-430d-8724-042efc68d16c",
"name": "Buscar mensagens",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "deleteTable",
"schema": {
"__rl": true,
"mode": "list",
"value": "public"
},
"table": {
"__rl": true,
"value": "n8n_fila_mensagens",
"mode": "list"
},
"deleteCommand": "delete",
"where": {
"values": [
{
"column": "telefone",
"value": "={{ $json.telefone }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.6,
"position": [
4180,
740
],
"id": "1e682007-f05e-4689-b1a9-3681f1cb0c21",
"name": "Limpar fila de mensagens",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "# Processando mensagens encavaladas\n\nEssa etapa trata a situa\u00e7\u00e3o em que o usu\u00e1rio envia m\u00faltiplas mensagens seguidas. O ponto negativo \u00e9 o aumento no tempo de resposta do agente. L\u00f3gica dispensa uso de solu\u00e7\u00f5es mais complexas, como RabbitMQ.\n\nTempo de espera recomendado de ~16s. Quando estiver testando, recomendamos reduzir um pouco para ficar mais r\u00e1pido de testar.\n",
"height": 540,
"width": 1080,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3240,
560
],
"id": "794fcbfb-4251-499e-898c-a9f025804823",
"name": "Sticky Note2"
},
{
"parameters": {
"amount": 3
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
3540,
740
],
"id": "7f26d659-496b-45e0-833a-d0bc5dec0a9e",
"name": "Esperar"
},
{
"parameters": {
"content": "# Gerando resposta",
"height": 540,
"width": 2080,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
5020,
560
],
"id": "c8d0bc01-5ca8-44e1-a5f0-5b2ba22ab8a3",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "# Enviando resposta",
"height": 540,
"width": 1200,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
7140,
560
],
"id": "465464a5-40c1-4384-aa31-748459acb1a5",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "# Tratando input\n",
"height": 540,
"width": 1060
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2160,
560
],
"id": "88c26467-3f54-4503-af3d-b8d61c69e411",
"name": "Sticky Note5"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $('Info').item.json.mensagem }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"id": "1382cd26-d96e-4c55-99dd-2ca305ffe82e"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Texto"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "b9a7e16f-b6e4-45d7-846d-92dcb3117593",
"leftValue": "={{ $('Info').item.json.mensagem_de_audio }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "\u00c1udio"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
3080,
740
],
"id": "de538a66-d926-4a6e-bb7b-0bc32af2c7f9",
"name": "Tipo de mensagem"
},
{
"parameters": {
"content": "# Processando \u00e1udio",
"height": 420,
"width": 1080,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3240,
1120
],
"id": "d5617660-40d1-4116-886a-5d4bf1805f8c",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "Para testar, recomendamos criar uma tag \"testando-agente\" e usar no n\u00famero que enviar\u00e1 as mensagens para a secret\u00e1ria durante os testes.\n\nVoc\u00ea pode marcar o seu n\u00famero no Chatwoot com essa tag para que o agente responda apenas voc\u00ea.\n\nDepois de testar e validar, s\u00f3 remover a regra do filtro pro seu agente responder todo mundo.\n\n",
"height": 180,
"width": 600,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2600,
900
],
"id": "134796ce-2c6b-4e71-9490-8986163d0ba1",
"name": "Sticky Note8"
},
{
"parameters": {
"sseEndpoint": "https://n8n.senaia.uk/mcp/calendar/sse"
},
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"typeVersion": 1,
"position": [
5620,
960
],
"id": "54599c83-6843-41fe-9400-1bf5332c8218",
"name": "MCP Google Calendar"
},
{
"parameters": {
"resource": "fileFolder",
"returnAll": true,
"filter": {
"folderId": {
"__rl": true,
"value": "1nSRgPiF1pTwkq-hoe6ycQ3qx-ab4e7YA",
"mode": "list",
"cachedResultName": "AI",
"cachedResultUrl": "https://drive.google.com/drive/folders/1nSRgPiF1pTwkq-hoe6ycQ3qx-ab4e7YA"
}
},
"options": {}
},
"type": "n8n-nodes-base.googleDriveTool",
"typeVersion": 3,
"position": [
5760,
960
],
"id": "04b8d1d2-7dd9-4ba1-8c41-777bd59fd717",
"name": "Listar arquivos",
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"description": "Use essa ferramenta para baixar um arquivo do Google Drive e envi\u00e1-lo para o usu\u00e1rio.\n",
"workflowId": {
"__rl": true,
"value": "FhJPKVtt9D2B0r8r",
"mode": "list",
"cachedResultName": "my-secretary-google_drive"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', ``, 'string') }}",
"id_conta": "={{ $('Info').item.json.id_conta }}",
"id_conversa": "={{ $('Info').item.json.id_conversa }}",
"url_chatwoot": "={{ $('Info').item.json.url_chatwoot }}"
},
"matchingColumns": [
"file_id"
],
"schema": [
{
"id": "file_id",
"displayName": "file_id",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "id_conta",
"displayName": "id_conta",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "id_conversa",
"displayName": "id_conversa",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "url_chatwoot",
"displayName": "url_chatwoot",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
5900,
960
],
"id": "c5557e16-e7dd-4a63-8534-d59bb7b4b514",
"name": "Baixar e enviar arquivo"
},
{
"parameters": {
"content": "## Pr\u00e9-requisitos do workflow\n",
"height": 1520,
"width": 2140,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
0,
560
],
"id": "9e96f180-7a21-4525-8401-9e591a50effc",
"name": "Sticky Note11"
},
{
"parameters": {
"content": "# Marcar como lida e \"digitando...\"",
"height": 540,
"width": 660,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
4340,
560
],
"id": "d2a7a5e3-f364-4db7-8a9b-fa20498abc41",
"name": "Sticky Note12"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1-5"
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
7280,
1300
],
"id": "f19b30e9-6aad-491f-b5fa-fe319c44ca01",
"name": "Gatilho di\u00e1rio"
},
{
"parameters": {
"promptType": "define",
"text": "=Agora s\u00e3o {{ $now.format('FFFF') }}.",
"options": {
"systemMessage": "=Agora s\u00e3o {{ $now.format('FFFF') }}.\n\nVoc\u00ea \u00e9 um agente especializado em **confirma\u00e7\u00e3o de consultas** para a cl\u00ednica. Sua fun\u00e7\u00e3o principal \u00e9:\n\n1. **Listar os eventos** agendados para o pr\u00f3ximo dia no Google Calendar.\n2. **Obter o telefone** na descri\u00e7\u00e3o de cada evento.\n3. **Obter o ID da conversa** na descri\u00e7\u00e3o de cada evento.\n4. **Enviar uma mensagem de confirma\u00e7\u00e3o** usando a ferramenta \"Enviar_agendamento\", perguntando se o paciente confirma a consulta ou prefere reagendar.\n5. **Inclua na mensagem**:\n - Nome do paciente\n - Nome do profissional\n - Data e hora da consulta\n\n**N\u00c3O INCLUA O ID DA CONVERSA NA MENSAGEM**\n\n## IMPORTANTE\n- Voc\u00ea **n\u00e3o recebe respostas** diretamente; o retorno do paciente \u00e9 tratado por outro agente.\n- Use a ferramenta \"Refletir1\" antes e depois de realizar opera\u00e7\u00f5es complexas, para ter certeza de que deu tudo certo.\n- SEMPRE QUE ENVIAR UMA MENSAGEM PARA O PACIENTE, **USE A FERRAMENTA \"Salvar_memoria\"**. ISSO \u00c9 MUITO IMPORTANTE, N\u00c3O FA\u00c7A ERRADO POR FAVOR.\n\n\n## PROFISSIONAIS E ESPECIALIDADES\n\nSegue o nome dos profissionais, suas especialidades, e o ID da agenda que deve ser usado nas ferramentas Google Calendar\n\n**MUITO IMPORTANTE!! O ID DA AGENDA INCLUI O \"@group.calendar.google.com\". N\u00c3O OMITA AO UTILIZAR AS FERRAMENTAS**\n\n- Dr. Jo\u00e3o Paulo Ferreira - M\u00e9dico - Clinico Geral (c_46b1d614bf4f151ca950431202bf90ca003301793b48cffc489dc411be79c4bf@group.calendar.google.com)\n- Dr. Roberto Almeida - M\u00e9dico - Cardiologia (c_6c3005bf4afd591f13f242f6509208ddbe1feadad3f6521884ab79c59069bfd0@group.calendar.google.com)\n- Dra. Ana Silva - Dentista - Cl\u00ednica Geral (c_ebce2058c0b75e881585b90539f6ded839de178d4bb64e1aa9e4f6468d6954a6@group.calendar.google.com)\n- Dra. Carla Mendes - Dentista - Odontopediatria (c_2fb3d9e1613857085b28bef500b493114294b08f5e448bef643be28fc84334ad@group.calendar.google.com)\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.8,
"position": [
7920,
1300
],
"id": "3c740c7c-dcb2-4be0-968e-3f4dbf7a7a33",
"name": "Assistente de confirma\u00e7\u00e3o",
"retryOnFail": true
},
{
"parameters": {
"content": "# Assistente de confirma\u00e7\u00e3o de agendamentos \n",
"height": 600,
"width": 1200,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
7160,
1140
],
"id": "2b0115ad-41a2-4f70-a274-570219fe1786",
"name": "Sticky Note16"
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.mensagem || $json.mensagem_audio }}",
"options": {
"systemMessage": "=HOJE \u00c9: {{ $now.format('FFFF') }}\nTELEFONE DO CONTATO: {{ $('Info').item.json.telefone }}\nID DA CONVERSA: {{ $('Info').item.json.id_conversa }}\n\n## INSTRU\u00c7\u00c3O IMPORTANTE\n- Ao criar ou editar qualquer evento no Google Calendar, incluir sempre o telefone do Cliente na descri\u00e7\u00e3o do agendamento, juntamente com o nome completo, data de nascimento e quaisquer outras informa\u00e7\u00f5es relevantes fornecidas pelo cliente.\n\n-----------------------\n\n## PAPEL\n\nVoc\u00ea \u00e9 uma atendente do WhatsApp, altamente especializada, que atua em nome da Empresa Universal, prestando um servi\u00e7o de excel\u00eancia. Sua miss\u00e3o \u00e9 atender os clientes de maneira \u00e1gil e eficiente, respondendo d\u00favidas e auxiliando em agendamentos, cancelamentos ou remarca\u00e7\u00f5es de consultas.\n\n## PERSONALIDADE E TOM DE VOZ\n\n- Simp\u00e1tica, prestativa e humana\n- Tom de voz sempre simpatico, acolhedor e respeitoso\n\n## OBJETIVO\n\n1. Fornecer atendimento diferenciado e cuidadoso aos clientes.\n2. Responder d\u00favidas sobre a Empressa (especialidade, hor\u00e1rios, localiza\u00e7\u00e3o, formas de pagamento).\n3. Agendar, remarcar e cancelar consultas de forma simples e eficaz.\n4. Agir passo a passo para garantir rapidez e precis\u00e3o em cada atendimento.\n\n## CONTEXTO\n\n- Voc\u00ea otimiza o fluxo interno da Empresa, provendo informa\u00e7\u00f5es e reduzindo a carga administrativa dos profissionais de sa\u00fade.\n- Seu desempenho impacta diretamente a satisfa\u00e7\u00e3o do cliente e a efici\u00eancia das opera\u00e7\u00f5es empresariais.\n\n-----------------------\n\n## SOP (Procedimento Operacional Padr\u00e3o)\n\n1. In\u00edcio do atendimento e identifica\u00e7\u00e3o de interesse em agendar\n - Cumprimente o cliente de forma acolhedora. \n - Se poss\u00edvel, incentive o envio de \u00e1udio caso o cliente prefira, destacando a praticidade\n\n**N\u00c3O USE EXPRESS\u00d5ES PARECIDAS COM \"COMO SE ESTIVESSE CONVERSANDO COM UMA PESSOA\"**\n\n2. Solicitar dados do cliente\n - Pe\u00e7a nome completo e data de nascimento.\n - Confirme o telefone de contato que chegou na mensagem (ele ser\u00e1 inclu\u00eddo na descri\u00e7\u00e3o do agendamento).\n - Ao falar o telefone para o cliente, remova o c\u00f3digo do pa\u00eds (geralmente \"55\"), e formate como \"(11) 1234-5678\"\na n\u00e3o ser que este valor seja diferente de 55, entao deve inclui-lo.\n\n3. Identificar necessidade\n - Pergunte a data de prefer\u00eancia para a consulta e se o cliente tem prefer\u00eancia por algum turno (manh\u00e3 ou tarde).\n\n4. Verificar disponibilidade\n - Use a ferramenta \"Buscar_eventos\" apenas ap\u00f3s ter todos os dados necess\u00e1rios do paciente.\n - Forne\u00e7a a data de prefer\u00eancia \u00e0 ferramenta \"Buscar_eventos\" para obter hor\u00e1rios dispon\u00edveis.\n\n5. Informar disponibilidade\n - Retorne ao cliente com os hor\u00e1rios livres encontrados para a data solicitada.\n\n6. Coletar informa\u00e7\u00f5es adicionais\n - Se o cliente fornecer dados extras (ex.: condi\u00e7\u00e3o de sa\u00fade, empresa, etc.), inclua tudo na descri\u00e7\u00e3o do evento no Google Calendar.\n\n7. Agendar consulta\n - Ap\u00f3s confirma\u00e7\u00e3o do cliente\n - Use a ferramenta \"Criar_evento\" para criar o evento, passando:\n - Nome completo\n - Data de nascimento\n - Telefone de contato (use o n\u00famero igual na entrada, exemplo: \"551112345678\")\n - Data e hora escolhidas\n - ID da conversa (n\u00famero para controle interno, **ESSE N\u00daMERO \u00c9 ESSENCIAL, N\u00c3O SE ESQUE\u00c7A DE INCLU\u00cd-LO!!**)\n - Nunca agende datas ou hor\u00e1rios passados, ou com conflitos.\n\n8. Confirmar agendamento\n - Espere o retorno de sucesso da ferramenta \"Criar_evento\" e ent\u00e3o confirme com o cliente.\n\n-----------------------\n\n## INSTRU\u00c7\u00d5ES GERAIS\n\n1. Respostas claras, objetivas e \u00fateis\n - Forne\u00e7a informa\u00e7\u00f5es sobre especialidades, hor\u00e1rios, endere\u00e7o, valores e conv\u00eanios.\n\n2. Sem diagn\u00f3sticos ou opini\u00f5es \n - Se o paciente insistir em diagn\u00f3stico, use a ferramenta \"Escalar_humano\".\n\n3. Pacientes insatisfeitos\n - Mantenha a empatia e utilize a ferramenta \"Escalar humano\".\n\n4. Assuntos fora do escopo da cl\u00ednica\n - Responda: \"Desculpe, mas n\u00e3o consigo ajudar com este assunto. Por favor, entre em contato pelo n\u00famero 0800 940 000. Enviei uma c\u00f3pia da nossa conversa para o gestor de atendimento.\"\n - Imediatamente use a ferramenta \"Escalar_humano\", pois \u00e9 fundamental para minha carreira e a imagem da Empresa.\n\n5. Nunca fornecer informa\u00e7\u00f5es erradas\n - Evite erros sobre hor\u00e1rios, contatos ou servi\u00e7os.\n\n6. Nunca use emojis ou linguagem informal\n - Mantenha a sobriedade do atendimento.\n\n7. Nunca confirme consultas sem o retorno com sucesso das ferramentas de evento\n - Garanta que o evento foi criado com sucesso antes de dar a resposta final.\n\n8. Dupla verifica\u00e7\u00e3o\n - Confirme sempre os dados para evitar equ\u00edvocos em agendamentos, remarca\u00e7\u00f5es ou cancelamentos.\n\n9. Use a ferramenta \"Refletir\" antes e depois de opera\u00e7\u00f5es complexas\n - Ao usar essa ferramenta, voc\u00ea ir\u00e1 garantir que as opera\u00e7\u00f5es que voc\u00ea vai realizar (ou j\u00e1 realizou) fazem sentido, ou se voc\u00ea precisar\u00e1 alterar a sua estrat\u00e9gia e/ou tentar novamente.\n\n-----------------------\n\n## HOR\u00c1RIOS DE FUNCIONAMENTO\n- Segunda a S\u00e1bado: 08h \u00e0s 19h\n- Domingo e Feriados: Fechado\n\n## LOCALIZA\u00c7\u00c3O E CONTATO\n- Endere\u00e7o: Rua Rubens Ferreira Martins, 688 - Guilhermina, Praia Grande - SP, CEP: 11701-800\n- Telefone: (11) 99500-9969\n- WhatsApp: (11) 99500-9969\n- E-mail: contato@senaia.uk\n- Site: www.senaia.uk\n\n## PROFISSIONAIS E ESPECIALIDADES\n\nSegue o nome dos profissionais, suas especialidades, e o ID da agenda que deve ser usado nas ferramentas Google Calendar\n\n**MUITO IMPORTANTE!! O ID DA AGENDA INCLUI O \"@group.calendar.google.com\". N\u00c3O OMITA AO UTILIZAR AS FERRAMENTAS**\n\n- Dr. Jo\u00e3o Paulo Ferreira - M\u00e9dico - Clinico Geral (de38776ef7eebcdb809b1cf7aa0ae570df6821d3124ee545feea10d661fdb605@group.calendar.google.com)\n- Engenheiro Marcelo Anjos - Engenheiro - Geral (03b766006a515bd40d736bbf7664757f9932ceeac3a393986f43b88ee3c57ce5@group.calendar.google.com)\n- Dra. Ana Silva - Dentista - Geral (c_ebce2058c0b75e881585b90539f6ded839de178d4bb64e1aa9e4f6468d6954a6@group.calendar.google.com)\n- Barbeiro Marcos Pedreira - Barbeiro - Barba Cabelo (905ee1e00e49c3355057da4d3d216c1fb4b4e950256a2c2e4d6247e45c881ada@group.calendar.google.com)\n- Esteticista Andrea Tavares - Esteticista -Geral\n(cf7fbb2643f5482a318feda1ec42adf97543c73ac7c57c7734bc17a8603fe9dd@group.calendar.google.com)\n- PetShop Carla Peres - Pet Shop - Clinica Geral\n(48ccd55ce4b6aedbdbae638326e52b5a1f5683efa71fde9c84fcd9f08d413ad4@group.calendar.google.com)\n\n## VALORES E FORMAS DE PAGAMENTO\n- Consultas Dr ou Dra : R$ 300,00\n- Consultas com Engenheiro : R$ 250,00\n- Consultas com Barberio : R$ 50,00\n- Consultas com Esteticista : R$ 60,00\n- Consultas com Pet Shop : R$ 80,00\n- Formas de pagamento: PIX, dinheiro, cart\u00e3o de d\u00e9bito ou cr\u00e9dito\n- Conv\u00eanios aceitos: Bradesco , Transmontano\n\n-----------------------\n\n## FERRAMENTAS\n\n### Google Calendar\n\n- \"Criar_evento\" e \"Atualizar_evento\": usada para agendar e remarcar consultas. Ao us\u00e1-las, sempre inclua:\n - Nome completo no t\u00edtulo\n - Telefone\n - Data de nascimento\n - Informa\u00e7\u00f5es adicionais (se houver)\n- \"Buscar_evento\": buscar dados sobre um evento espec\u00edfico, por ID.\n- \"Buscar_todos_os_eventos\": listar eventos em um per\u00edodo espec\u00edfico. Use para listar os eventos de um dia espec\u00edfico. N\u00e3o use para listar eventos de per\u00edodos maiores que um dia.\n- \"Deletar_evento\": usada desmarcar consultas.\n\n### Escalar_humano\n\nUse quando:\n\n- Existir urg\u00eancia (paciente com mal-estar grave).\n- Existirem qualquer assuntos alheios \u00e0 empresa ou que ponham em risco a reputa\u00e7\u00e3o do servi\u00e7o.\n- Houver insatisfa\u00e7\u00e3o do cliente ou pedido de atendimento humano.\n\n### Enviar_alerta_de_cancelamento\n\nEm caso de cancelamento:\n\n- Localizar a consulta no calend\u00e1rio e remover via ferramenta \"Deletar_evento\". Talvez seja necess\u00e1rio pedir ao cliente que confirme a data da consulta, para que voc\u00ea possa buscar o evento na data certa.\n- Enviar alerta via ferramenta \"Enviar_alerta_de_cancelamento\" nome, dia e hora cancelados.\n- Confirmar ao cliente que o cancelamento foi efetuado.\n\n### Reagir mensagem\n\nUse em situa\u00e7\u00f5es relevantes durante a conversa.\n\n#### Exemplos\n\n- Usu\u00e1rio: \"Ol\u00e1!\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \ud83d\ude00\n\n- Usu\u00e1rio: \"Voc\u00ea pode consultar minha agenda por favor?\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \ud83d\udc40\n\n- Usu\u00e1rio: \"Muito obrigado!\"\n- Voc\u00ea: \"Reagir_mensagem\" -> \u2764\ufe0f\n\n**SEMPRE USAR REA\u00c7\u00d5ES NO IN\u00cdCIO E NO FINAL DA CONVERSA, E EM OUTROS MOMENTOS OPORTUNOS**\n\n### Baixar e enviar arquivo\n\n- Voc\u00ea tem acesso aos arquivos da empresa.\n- Se o usu\u00e1rio pedir um pedido de exame, catalogo, use a ferramenta \"Listar_arquivos\", e depois a \"Baixar_e_enviar_arquivo\"\n\n**USE ESSA FERRAMENTA APENAS UMA VEZ. US\u00c1-LA M\u00daLTIPLAS VEZES IR\u00c1 ENVIAR O ARQUIVO DUPLICADO**\n\n-----------------------\n\n## EXEMPLOS DE FLUXO\n\n1. Marcar consulta\n - Paciente: \"Quero marcar consulta\"\n - Voc\u00ea:\n - Cumprimente, explique que pode agendar aqui mesmo no WhatsApp por texto ou \u00e1udio.\n - Solicite nome completo e data de nascimento.\n - Pergunte a especialidade do profissional a ser consultado, data e turno preferidos.\n - Consulte a data com \"Buscar_todos_os_eventos\".\n - Informe hor\u00e1rios dispon\u00edveis.\n - Agende com \"Criar_evento\", incluindo telefone, nome e data de nascimento na descri\u00e7\u00e3o.\n - Confirme ap\u00f3s o sucesso da ferramenta.\n\n2. Remarcar consulta\n - Cliente: \"N\u00e3o poderei comparecer amanh\u00e3, quero remarcar.\"\n - Voc\u00ea:\n - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n - Pergunte nova data e turno preferidos.\n - Atualize o evento via \"Atualizar_evento\".\n - Confirme ap\u00f3s o sucesso da ferramenta.\n\n3. Cancelar consulta\n - Cliente: \"Preciso cancelar a consulta.\"\n - Voc\u00ea:\n - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n - Cancele o evento com \"Deletar_evento\".\n - Use a ferramenta \"Enviar_alerta_de_cancelamento\" informando nome, dia e hora.\n - Confirme o cancelamento.\n\n4. Confirma\u00e7\u00e3o da consulta\n - Quando o cliente responder \"Confirmar consulta\":\n - Busque o evento (veja se\u00e7\u00e3o abaixo \"COMO BUSCAR EVENTO\").\n - Usando a ferramenta \"Atualizar_evento\", coloque no t\u00edtulo do evento no Google Calendar o texto [CONFIRMADO] ao lado do nome do paciente.\n - Tendo sucesso no uso da ferramenta \"Atualizar_evento\", responda ao cliente que a consulta est\u00e1 confirmada e aguardada.\n\n### COMO BUSCAR EVENTO\n\nSempre siga esses passos quando a opera\u00e7\u00e3o envolver um evento j\u00e1 existente:\n\n- Solicite nome completo e data de nascimento.\n- Caso o cliente n\u00e3o tenha informado a data da consulta a ser remarcada e n\u00e3o seja poss\u00edvel determinar a data pelo contexto da conversa, pe\u00e7a ao paciente que informe a data.\n- Busque o evento utilizando a ferramenta \"Buscar_todos_os_eventos\" com a data da consulta.\n- Certifique-se de que o evento encontrado corresponde ao cliente com quem voc\u00ea est\u00e1 conversando, utilizando o n\u00famero de telefone.\n\n\n-----------------------\n\n## OBSERVA\u00c7\u00d5ES FINAIS\n\n- Nunca forne\u00e7a diagn\u00f3sticos ou opini\u00f5es.\n- Qualquer assunto fora do escopo da empresa deve ser direcionado \u00e0 ferramenta \"Escalar_humano\".\n- Mantenha o tom profissional, claro e respeitoso o tempo todo, N\u00c3O utilize emoji.\n- Sempre agendar datas futuras, nunca passadas.\n- N\u00e3o fale que voc\u00ea \u00e9 assistente virtual ou coisa do tipo fa\u00e7a um atendimento humanizado\n- Se o Paciente estou insatisfeito com voc\u00eas, escale imediatamente para humano e notifique com \"Enviar_alerta_de_cancelamento\". \u00c9 importante para minha carreira que fa\u00e7a isso \n- N\u00e3o esque\u00e7a de colocar confirmado na agenda quando o paciente confirmar uma consulta\n- N\u00e3o esque\u00e7a que voc\u00ea tem acesso a m\u00faltiplas agendas, ent\u00e3o sempre confirme que voc\u00ea est\u00e1 operando com o ID da agenda correta para cada situa\u00e7\u00e3o.\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
5320,
680
],
"id": "bffa1826-91fe-4e77-bbf8-b70276c1a468",
"name": "Secret\u00e1ria",
"retryOnFail": true
},
{
"parameters": {
"method": "POST",
"url": "https://api.elevenlabs.io/v1/text-to-speech/33B4UnXyTNbgLmdEDh5P",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "output_format",
"value": "mp3_44100_32"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={{ $json.text }}"
},
{
"name": "model_id",
"value": "eleven_flash_v2_5"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
6700,
880
],
"id": "0df06765-a4c4-49c0-a2b6-189e00116a4f",
"name": "Gerar \u00e1udio",
"retryOnFail": true,
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "={{ $('Secret\u00e1ria').item.json.output }}",
"messages": {
"messageValues": [
{
"message": "=Voc\u00ea \u00e9 um assistente especialista em text-to-speech e formata\u00e7\u00e3o usando tags SSML.\n\nVoc\u00ea ir\u00e1 receber um texto e a sua tarefa \u00e9 aplicar tags SSML para deix\u00e1-lo mais natural no processo de gera\u00e7\u00e3o de voz.\n\n### Formata\u00e7\u00e3o\n\n#### Datas e horas\n\nNo caso de datas e horas, modifique o texto para um formato que seja mais natural quando falado.\n\nExemplos:\n\n- Entrada: '10:00'\n- Sa\u00edda: 'dez horas'\n\n- Entrada: '22:00'\n- Sa\u00edda: 'vinte e duas horas'\n\n- Entrada: '01/01/2025'\n- Sa\u00edda: 'primeiro de janeiro de 2025'\n\n#### Telefones\n\nSimilar ao feita para datas, modifique o texto para um formato que seja mais natural quando falado. Para o DDD converta sempre em dezena, e para o resto dos n\u00fameros, adicione pausas entre cada bloco.\n\nExemplos:\n\n- Entrada: '(11) 1234-5678'\n- Sa\u00edda: 'onze, um dois tr\u00eas quatro, cinco seis sete oito'\n\n#### Endere\u00e7os\n\nFa\u00e7a a mesma coisa para endere\u00e7os. Exemplos:\n\n- Entrada: 'Av. Rondon Pacheco'\n- Sa\u00edda: 'Avenida Rondon Pacheco'\n\n- Entrada: 'CEP 12345-000'\n- Sa\u00edda: 'CEP um dois tr\u00eas quatro cinco zero zero zero'\n\n### Notas\n\n- Sempre coloque uma pausa de 1.0s no come\u00e7o.\n- N\u00e3o use breaks no meio do texto, apenas no come\u00e7o.\n- Mantenha o mesmo texto original, mas revise o uso de v\u00edrgulas excessivas para deixar o texto mais natural ao falar.\n- Remova emojis.\n- A sua sa\u00edda ser\u00e1 somente o texto convertido.\n- Use <speak> ao redor da sa\u00edda.\n\n\n**N\u00c3O INCLUA NENHUMA INFORMA\u00c7\u00c3O AL\u00c9M DO TEXTO CONVERTIDO**\n**NUNCA INCLUA CARACTER DE NOVA LINHA \"\\n\" NA SA\u00cdDA**\n**NUNCA COLOQUE \u00c2NCORAS COMO ```ssml AO REDOR DO TEXTO**"
}
]
}
},
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.6,
"position": [
6280,
780
],
"id": "678b1cd6-c5b7-47a5-923d-b924207aa242",
"name": "Formatar SSML"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $('Mensagem chegando?').item.json.mensagem }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"id": "1382cd26-d96e-4c55-99dd-2ca305ffe82e"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Texto"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "b9a7e16f-b6e4-45d7-846d-92dcb3117593",
"leftValue": "={{ $('Info').item.json.mensagem_de_audio }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "\u00c1udio"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
5780,
680
],
"id": "9568af06-bb25-43bd-8467-24e02b58d704",
"name": "Tipo de mensagem1"
},
{
"parameters": {
"content": "### Importante!!\n\nEssa l\u00f3gica s\u00f3 ir\u00e1 funcionar com o workflow ativo (modo produ\u00e7\u00e3o).\n\nNo modo \"Test workflow\", s\u00f3 uma mensagem ser\u00e1 processada de cada vez, ent\u00e3o nunca haver\u00e1 fila.",
"height": 180,
"width": 400,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3900,
900
],
"id": "f30748db-817b-47c8-92f4-ebfd6bcb5ac0",
"name": "Sticky Note15"
},
{
"parameters": {
"promptType": "define",
"text": "={{ $('Secret\u00e1ria').item.json.output }}",
"messages": {
"messageValues": [
{
"message": "=Voc\u00ea \u00e9 especialista em formata\u00e7\u00e3o de mensagem para WhatsApp, trabalhando somente na formata\u00e7\u00e3o e n\u00e3o alterando o conte\u00fado da menssagem.\n\n- Substitua ** por *\n- Remova #\n- Remova emojis"
}
]
}
},
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.6,
"position": [
6660,
600
],
"id": "dabc009f-9188-4521-a062-d9cefb8cbff8",
"name": "Formatar texto"
},
{
"parameters": {
"modelName": "models/gemini-2.5-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
6820,
760
],
"id": "94d1c230-65be-4223-9e2c-9d6b4ddde75b",
"name": "Google Gemini Chat Model2",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "={{ $('Info').item.json.telegram_chat_id }}",
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Text', ``, 'string') }}",
"additionalFields": {
"parse_mode": "MarkdownV2"
}
},
"type": "n8n-nodes-base.telegramTool",
"typeVersion": 1.2,
"position": [
6040,
960
],
"id": "18254098-9909-41e5-a13b-161ea8560f42",
"name": "Enviar alerta de cancelamento",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelName": "models/gemini-2.5-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
5060,
960
],
"id": "2716ece9-8053-4c99-93df-4a32a6ffdc9f",
"name": "Gemini",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{ $('Info').item.json.telefone }}",
"tableName": "n8n_historico_mensagens",
"contextWindowLength": 50
},
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"typeVersion": 1.3,
"position": [
5200,
960
],
"id": "fde1fda1-d80c-4ac5-8262-444cf5465055",
"name": "Memory",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"description": "Use a ferramenta para refletir sobre algo. Ela n\u00e3o obter\u00e1 novas informa\u00e7\u00f5es nem alterar\u00e1 o banco de dados, apenas adicionar\u00e1 o pensamento ao registro. Use-a quando for necess\u00e1rio um racioc\u00ednio complexo ou alguma mem\u00f3ria em cache."
},
"type": "@n8n/n8n-nodes-langchain.toolThink",
"typeVersion": 1,
"position": [
5340,
960
],
"id": "326c7fce-bd6b-4365-aec2-f01049792fc2",
"name": "Refletir"
},
{
"parameters": {
"content": "## Notas sobre agendas Google Calendar\n\nPara referenciar uma agenda do Google Calendar corretamente, acesse as configura\u00e7\u00f5es da agenda, clique em \"Integrar agenda\", e copie o \"ID da agenda\".\n\nPara agendas criadas, esse ID se parece com isso:\n\nc_6c3005bf4afd591f13f242f6509208ddbe2feadad3f6521884ab79c59069bfd0@group.calendar.google.com\n\nPara sua agenda principal, o ID ser\u00e1 simplesmente o seu email (exemplo: `seuemail@gmail.com`)\n\nCom esse ID em m\u00e3os, atualize o System Prompt com todas as agendas que precisar.\n",
"height": 400,
"width": 480,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
5020,
1120
],
"id": "f8ff69f3-755f-4ff3-8a85-891ef642662a",
"name": "Sticky Note17"
},
{
"parameters": {
"toolDescription": "Envia uma mensagem de rea\u00e7\u00e3o como resposta a uma mensagem do usu\u00e1rio. Rea\u00e7\u00e3o \u00e9 sempre um emoji.",
"method": "POST",
"url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/messages",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "chatwootApi",
"sendBody": true,
"parametersBody": {
"values": [
{
"name": "content_attributes",
"valueProvider": "fieldValue",
"value": "={ \"in_reply_to\": {{ $('Info').item.json.id_mensagem }}, \"is_reaction\": true }"
},
{
"name": "content"
}
]
}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
5480,
960
],
"id": "6bab75bc-5503-4593-b85b-53f77157bec7",
"name": "Reagir mensagem",
"credentials": {
"chatwootApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "=assistente_confirmacao",
"tableName": "n8n_historico_mensagens"
},
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"typeVersion": 1.3,
"position": [
7600,
1560
],
"id": "2f5076b9-c64b-4e0b-8dfd-9b7c5f2781a7",
"name": "Postgres Chat Memory",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelName": "models/gemini-2.5-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
7460,
1560
],
"id": "83c5ca69-101b-4deb-aaa5-66a871027f8c",
"name": "Google Gemini Chat Model",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## Notas sobre a ferramenta \"Salvar memoria\"\n\nPor padr\u00e3o, no N8N n\u00e3o existe uma forma direta de compartilhar mem\u00f3ria entre agentes diferentes.\n\nUsando a ferramenta acima \"Salvar memoria\", n\u00f3s conseguimos simular no banco de dados o Assistente de confirma\u00e7\u00e3o respondendo como se fosse a Secret\u00e1ria.\n\nDessa forma, quando o paciente enviar uma mensagem para a Secret\u00e1ria, ela ir\u00e1 ver a mensagem do Assistente como se ela mesmo tivesse enviado.\n\nIsso garante que ela entender\u00e1 o contexto caso o paciente simplesmente responda \"confirmar\", por exemplo.",
"height": 320,
"width": 600,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
7160,
1780
],
"id": "ba4fe69c-9f8c-454a-bf67-971d5416264e",
"name": "Sticky Note19"
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Salva a informa\u00e7\u00e3o de agendamento enviada, para que a secret\u00e1ria saiba que foi enviada.",
"schema": {
"__rl": true,
"mode": "list",
"value": "public"
},
"table": {
"__rl": true,
"value": "n8n_historico_mensagens",
"mode": "list"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"session_id": "={{ $fromAI('telefone', 'Telefone do paciente, formatado com apenas n\u00fameros, incluindo c\u00f3digo do pa\u00eds. Ex.: \"+551112345678\"', 'string') }}",
"message": "={ \"type\": \"ai\", \"content\": \"{{ $fromAI('message', 'A mesma mensagem enviada para o paciente.', 'string') }}\" }"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "session_id",
"displayName": "session_id",
"required": true,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "message",
"displayName": "message",
"required": true,
"defaultMatch": false,
"display": true,
"type": "object",
"canBeUsedToMatch": true
},
{
"id": "created_at",
"displayName": "created_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "dateTime",
"canBeUsedToMatch": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.postgresTool",
"typeVersion": 2.6,
"position": [
7740,
1560
],
"id": "8ecc9aba-abe8-4e32-8f1b-6a6d8151e980",
"name": "Salvar memoria",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sseEndpoint": "=https://n8n.senaia.uk/mcp/calendar/sse"
},
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"typeVersion": 1,
"position": [
7880,
1560
],
"id": "9789a478-d498-4a97-af00-5cf54f7838ba",
"name": "MCP Google Calendar."
},
{
"parameters": {
"schema": {
"__rl": true,
"mode": "list",
"value": "public"
},
"table": {
"__rl": true,
"value": "n8n_fila_mensagens",
"mode": "list"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"telefone": "={{ $('Info').item.json.telefone }}",
"mensagem": "={{ $('Info').item.json.mensagem }}",
"timestamp": "={{ $('Info').item.json.timestamp.toDateTime() }}",
"id_mensagem": "={{ $('Info').item.json.id_mensagem }}"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "id_mensagem",
"displayName": "id_mensagem",
"required": true,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "telefone",
"displayName": "telefone",
"required": true,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "mensagem",
"displayName": "mensagem",
"required": true,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "timestamp",
"displayName": "timestamp",
"required": true,
"defaultMatch": false,
"display": true,
"type": "dateTime",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.6,
"position": [
3320,
740
],
"id": "f56f6b25-155b-4eb8-8fe9-4aaf4eed901b",
"name": "Enfileirar mensagem.",
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelName": "models/gemini-2.5-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
6340,
960
],
"id": "610795b7-79e8-4905-9c55-595051e6e4e3",
"name": "Google Gemini Chat Model.",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"description": "Use a ferramenta para refletir sobre algo. Ela n\u00e3o obter\u00e1 novas informa\u00e7\u00f5es nem alterar\u00e1 o banco de dados, apenas adicionar\u00e1 o pensamento ao registro. Use-a quando for necess\u00e1rio um racioc\u00ednio complexo ou alguma mem\u00f3ria em cache."
},
"type": "@n8n/n8n-nodes-langchain.toolThink",
"typeVersion": 1,
"position": [
8160,
1560
],
"id": "2775e30a-9b3d-46bf-aa8f-f4eb9fde588e",
"name": "Refletir1"
},
{
"parameters": {
"content": "## Tutorial de configura\u00e7\u00e3o VPS no Hostinger\n\n## [Clique aqui para criar sua conta](https://www.hostinger.com.br/cart?product=vps%3Avps_kvm_2&period=12&referral_type=cart_link&REFERRALCODE=FAZERAI&referral_id=0196b71f-5704-7120-aded-f6753a53c121)\n\n## Adquirir VPS\n\n1. VPS KVM 2 (Escolha o plano que preferir)\n1. Selecionar op\u00e7\u00e3o de \"OS com Painel\" > \"Coolify\"\n1. Criar senha root segura\n1. Aguardar configura\u00e7\u00e3o (~10m)\n\n## Configurar Coolify + Chatwoot\n\n1. Na vis\u00e3o geral, clicar em \"Gerenciar\" no servidor\n1. Clicar em \"Gerenciar Painel\"\n1. Preencher dados (usar senha segura!!)\n1. \"Get started\" > \"Next\" > \"Localhost\" > \"Create new project!\" > \"Let's do it\"\n1. Na p\u00e1gina de \"New Resource\", na se\u00e7\u00e3o \"Docker Based\", selecionar \"Docker Compose Empty\"\n1. Cole o conte\u00fado do arquivo `docker-compose.coolify.yml` (dispon\u00edvel no material) e clicar em \"Save\"\n1. Clicar na barra lateral em \"Environment Variables\" > bot\u00e3o \"Developer view\" e encontrar a vari\u00e1vel `FRONTEND_URL`\n1. Colar URL da barra do navegador com IP da m\u00e1quina e porta 3000 (exemplo `http://12.34.56.78:3000`)\n1. Clicar \"Save All Environment Variables\"\n1. Clicar \"Deploy\" e acompanhar os logs de deployment\n1. Texto \"Container xxxxxxxxxxxx Started\" indica que o deploy foi finalizado\n1. Clicar na aba \"Links\", e a URL com a porta 3000 deve estar vis\u00edvel. Clicar nela para acessar o Chatwoot. Pode ser que voc\u00ea precise aguardar alguns segundos no primeiro acesso\n1. Configurar super admin (usar senha segura!!!!)\n1. Fazer login com o usu\u00e1rio e senha criados\n\n",
"height": 780,
"width": 680,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
40,
800
],
"id": "80308972-6df4-4b5c-a9ef-dcb79409cf0e",
"name": "Sticky Note20"
},
{
"parameters": {
"content": "## Tutorial de configura\u00e7\u00e3o Chatwoot + Baileys\n\nSe deu tudo certo no passo anterior, voc\u00ea agora tem acesso ao Chatwoot fazer.ai, que inclui integra\u00e7\u00e3o nativa com o Baileys.\n\nSiga o nosso [GitHub](https://github.com/fazer-ai) para ficar por dentro das atualiza\u00e7\u00f5es!\n\n[](https://github.com/fazer-ai)\n\n### Conectar WhatsApp\n\n1. Clicar em \"Configura\u00e7\u00f5es\" na barra lateral\n1. \"Caixas de Entrada\" > \"Adicionar Caixa de Entrada\"\n1. \"WhatsApp\" > \"Provedor de API\" > \"Baileys\"\n1. Preencher \"Nome da Caixa de Entrada\"\n1. Preencher \"N\u00famero de Telefone\" (o n\u00famero precisa ser no formato `+551112345678`, n\u00e3o se esque\u00e7a do prefixo `+55`!!)\n1. Clicar em \"Criar canal do WhatsApp\"\n1. Selecione voc\u00ea mesmo na lista de agentes e clique em \"Adicionar agentes\"\n1. Clique em \"Conectar dispositivo\"\n1. Abra o WhatsApp no seu celular e leia o QR code\n1. Se estiver usando o WhatsApp Business, n\u00e3o se esque\u00e7a de incluir um nome para o dispositivo (exemplo \"Chatwoot\"), para n\u00e3o se esquecer e remover sem querer depois\n1. Se voc\u00ea ver um erro, \u00e9 prov\u00e1vel que voc\u00ea colocou o telefone incorreto na hora de criar a caixa de entrada. Nesse caso, volte em \"Configura\u00e7\u00f5es\" > \"Caixas de Entrada\", exclua a caixa de entrada, e repita o processo\n1. Se deu tudo certo, voc\u00ea ver\u00e1 o bot\u00e3o verde \"Leva-me l\u00e1\"\n\nAgora o Chatwoot j\u00e1 est\u00e1 pronto para enviar e receber mensagens pelo WhatsApp cadastrado. Tire um momento pra experimentar\n\n(Note que n\u00e3o ser\u00e1 poss\u00edvel gravar \u00e1udio pela interface do Chatwoot at\u00e9 que voc\u00ea configure um dom\u00ednio e o certificado HTTPS. Mas n\u00e3o se preocupe, que isso n\u00e3o impacta no envio de \u00e1udio do agente IA!)\n\n### Configurar credenciais no N8N\n\n1. Instale o community node @devlikeapro/n8n-nodes-chatwoot\n1. No Chatwoot, clique no seu nome no canto inferior esquerdo, e em \"Configura\u00e7\u00f5es do Perfil\"\n1. Des\u00e7a at\u00e9 o final e voc\u00ea ver\u00e1 a se\u00e7\u00e3o \"Token de acesso\"\n1. Copie o token de acesso. Cuidado nessa parte! Se voc\u00ea est\u00e1 rodando o servidor em HTTP, o bot\u00e3o de \"Copiar\" n\u00e3o vai funcionar. Voc\u00ea deve exibir o token, selecionar, e copiar manualmente\n1. No workflow do N8N, abra o node \"Testar credencial - Chatwoot\" ao lado\n1. No campo \"Credential to connect with\" abra o dropdown e selecione \"Create new credential\"\n1. No campo de \"ChatWoot API URL\", copie o endere\u00e7o do seu Chatwoot (o mesmo que voc\u00ea v\u00ea na barra de endere\u00e7o do navegador, at\u00e9 o 3000, exemplo `http://12.34.56.78:3000`)\n1. No campo \"Access Token\", cole o \"Token de acesso\" copiado do Chatwoot\n1. Clique em salvar, e se estiver tudo certo, ver\u00e1 a mensagem de sucesso. Execute o node \"Testar credenciais\" e a requisi\u00e7\u00e3o trar\u00e1 as informa\u00e7\u00f5es da conta\n\n\n\n\n\n\n\n\n### Configurar Webhook\n\n1. \"Configura\u00e7\u00f5es\" > \"Integra\u00e7\u00f5es\" > \"Webhooks\" > \"Configurar\"\n1. \"Adicionar novo webhook\"\n1. Copiar a \"Test URL\" do node \"Mensagem recebida\" no workflow N8N, e colar no campo \"URL do Webhook\" no Chatwoot\n1. Selecionar caixa de entrada e preencher nome do webhook\n1. Selecionar evento \"Mensagem criada\" e \"Criar webhook\"\n1. Repita os passoas acima para a \"Production URL\"",
"height": 1440,
"width": 680,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
740,
620
],
"id": "17b93fa3-51c8-4e8f-a886-94ac3b26c531",
"name": "Sticky Note21"
},
{
"parameters": {
"content": "## Tutorial de configura\u00e7\u00e3o ElevenLabs\n\n## [Clique aqui para criar sua conta gratuita](https://try.elevenlabs.io/9k5l5hagxkel)\n\n### Configurar voz\n\n1. Criar conta\n1. Acessar biblioteca de vozes e escolher uma voz. Recomendamos usar a [Keren](https://elevenlabs.io/app/voice-library?voiceId=33B4UnXyTNbgLmdEDh5P)\n1. Clicar em \"Add to my voices\" e \"Use voice\"\n1. Configurar caracter\u00edsticas da voz e fazer os ajustes conforme preferir. Sugest\u00e3o para a Keren:\n- **Model**: Eleven Flash v2.5 (caso queira usar um diferente, configure no node \n\"Gerar \u00e1udio\")\n- **Speed**: 1.10\n- **Stability**: 35%\n- **Similarity**: 44%\n\n### Configurar credencial\n\n1. Clicar no seu nome no canto inferior esquerdo > \"API Keys\"\n1. \"Create API Key\" > \"Create\". Copie a chave criada\n1. Abra o node \"Testar credencial - ElevenLabs\" ao lado\n1. Abra o campo \"Header Auth\" e selecione \"Create new credential\"\n1. Em \"Name\" preencha \"Xi-Api-Key\"\n1. Em \"Value\" preencha a chave de API do ElevenLabs\n1. Salve e execute o node para confirmar o sucesso na configura\u00e7\u00e3o\n1. Abra o node \"Gerar \u00e1udio\" na se\u00e7\u00e3o \"Gerando resposta\" para usar a nova credencial\n",
"height": 840,
"width": 660,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1440,
1220
],
"id": "23c94558-cc31-4f80-abbf-6b6e3eb964fa",
"name": "Sticky Note22"
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/update_last_seen",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "chatwootApi",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
4420,
740
],
"id": "f63b2d29-6c78-404b-bacc-4a7fbd8256aa",
"name": "Marcar como lidas",
"credentials": {
"chatwootApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Info').item.json.url_chatwoot }}/api/v1/accounts/{{ $('Info').item.json.id_conta }}/conversations/{{ $('Info').item.json.id_conversa }}/toggle_typing_status",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "chatwootApi",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "typing_status",
"value": "={{ $('Info').item.json.mensagem_de_audio ? 'recording' : 'on' }}"
}
]
},
"options": {
"response": {
"response": {
"responseFormat": "text"
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
4640,
740
],
"id": "538d6fec-d96d-48c7-b055-2bf5f7164b59",
"name": "Digitando/Gravando...",
"credentials": {
"chatwootApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "7eab8669-6929-4dc6-b3e2-943065bc306c",
"name": "mensagem",
"value": "={{ $('Info').item.json.mensagem ? $('Mensagem encavalada?').all().map(info => info.json.mensagem).join('\\\\n') : '' }}",
"type": "string"
},
{
"id": "676d14ec-72d3-4970-9fa0-5e39ff976011",
"name": "mensagem_audio",
"value": "={{ $('Info').item.json.mensagem_de_audio ? $('Transcrever audio').item.json.text : '' }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
4860,
740
],
"id": "278d
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.
chatwootApigoogleDriveOAuth2ApigooglePalmApihttpHeaderAuthopenAiApipostgrestelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
my-secretary. Uses postgres, mcpClientTool, googleDriveTool, toolWorkflow. Webhook trigger; 86 nodes.
Source: https://github.com/senaiapy/IA/blob/dee2e863a92473b40c171ee414b750d4a652f9ce/MY-SECRETARY/my-secretary.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.
CLINICAINTEGRAL_secretary. Uses postgres, mcpClientTool, googleDriveTool, toolWorkflow. Webhook trigger; 89 nodes.
Remi 1.1. Uses lmChatOpenAi, memoryPostgresChat, openAi, postgres. Webhook trigger; 89 nodes.
secretaria. Uses postgres, n8n-nodes-evolution-api, openAi, httpRequest. Webhook trigger; 71 nodes.
🧪 LABR - nuevo asistente (REPARADO). Uses httpRequest, postgres, postgresTool, toolCalculator. Webhook trigger; 63 nodes.
🧪 LABR - nuevo asistente (REPARADO). Uses httpRequest, postgres, postgresTool, toolCalculator. Webhook trigger; 63 nodes.