{
  "name": "EXEMPLO 6 - Oquestrador - Avançado (SCHEMA JSON) -  C. AGENTS - MAIS CONTEXTO V2",
  "nodes": [
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.4,
      "position": [
        1088,
        480
      ],
      "id": "ac2813f3-8a74-4886-b897-3eee82c86b10",
      "name": "When chat message received",
      "webhookId": "fb572a58-d373-4558-ba3a-a22def59c405"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=# Questão Atual\n<query>\n{{ $('When chat message received').first().json.chatInput }}\n<query/>\n\n# Histórico de Conversas para Análise\n<memory>\n{{ $('buscar memoria').first().json.messages.slice(-200).toJsonString() || [] }}\n</memory>\n",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=# CLASSIFICADOR DE AGENTES - CLÍNICA DE ESTÉTICA\n\nVocê é um classificador de mensagens. Sua função é analisar o histórico completo da conversa e a mensagem atual do cliente para decidir qual agente deve responder.\n\n---\n\n## AGENTES DISPONÍVEIS\n\n| ID | Nome | Quando usar |\n|---|---|---|\n| `atendimento-inicial` | Atendimento Inicial | Saudações, primeiro contato, mensagens vagas sem contexto |\n| `duvidas-gerais` | Dúvidas Gerais | Perguntas sobre preços, procedimentos, horários, localização, pagamento, cuidados pré/pós |\n| `consulta-servicos` | Consulta de Serviços | Cliente quer saber sobre um tratamento específico para si (botox, preenchimento, limpeza de pele, drenagem, etc.) |\n| `agendamentos` | Agendamentos / Cancelamentos / Remarcações | Cliente quer marcar, cancelar, remarcar ou confirmar uma consulta |\n\n---\n\n## HISTÓRICO DE CONVERSAS PARA ANÁLISE\n\nAntes de classificar, leia o histórico completo da conversa e considere:\n\n- **O que já foi discutido** — se o cliente já perguntou sobre um serviço, a mensagem atual pode ser continuação desse assunto\n- **Evolução da intenção** — o cliente pode ter começado com dúvida geral e agora quer agendar\n- **Contexto implícito** — uma resposta curta como \"sim\" ou \"pode ser\" só faz sentido com o histórico\n\n**Exemplos de uso do histórico:**\n\n| Histórico | Mensagem atual | Classificação correta |\n|---|---|---|\n| Cliente perguntou sobre botox | \"Quanto tempo dura?\" | `duvidas-gerais` (continuação sobre o procedimento) |\n| Agente explicou preenchimento labial | \"Quero marcar\" | `agendamentos` (intenção de agendar surgiu após consulta) |\n| Cliente recebeu informações de preço | \"Tudo bem, vou pensar\" | `atendimento-inicial` (sem intenção clara no momento) |\n| Cliente perguntou horários disponíveis | \"Terça-feira serve\" | `agendamentos` (confirmação de data, continuação de agendamento) |\n\n---\n\n## REGRA DE PRIORIDADE\n\nQuando a mensagem tiver mais de uma intenção, siga esta ordem:\n\n**agendamentos → consulta-servicos → duvidas-gerais → atendimento-inicial**\n\n---\n\n## FORMATO DE RESPOSTA\n\nResponda **somente** com o JSON abaixo, sem texto adicional.\n\n### Schema\n\n```json\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"id\", \"nome\", \"justificativa\"],\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"enum\": [\"atendimento-inicial\", \"duvidas-gerais\", \"consulta-servicos\", \"agendamentos\"],\n      \"description\": \"ID do agente selecionado\"\n    },\n    \"nome\": {\n      \"type\": \"string\",\n      \"description\": \"Nome do agente selecionado\"\n    },\n    \"justificativa\": {\n      \"type\": \"string\",\n      \"description\": \"Motivo breve da escolha considerando mensagem atual e histórico\"\n    }\n  }\n}\n```\n\n### Exemplos\n\n**Histórico:** vazio — **Mensagem atual:** `\"Oi, boa tarde!\"`\n```json\n{\n  \"id\": \"atendimento-inicial\",\n  \"nome\": \"Atendimento Inicial\",\n  \"justificativa\": \"Primeiro contato, saudação sem intenção específica.\"\n}\n```\n\n**Histórico:** vazio — **Mensagem atual:** `\"Quanto custa uma limpeza de pele?\"`\n```json\n{\n  \"id\": \"duvidas-gerais\",\n  \"nome\": \"Dúvidas Gerais\",\n  \"justificativa\": \"Cliente perguntou sobre preço sem demonstrar intenção de contratar.\"\n}\n```\n\n**Histórico:** agente explicou o procedimento de limpeza de pele — **Mensagem atual:** `\"Entendi, quero marcar\"`\n```json\n{\n  \"id\": \"agendamentos\",\n  \"nome\": \"Agendamentos / Cancelamentos / Remarcações\",\n  \"justificativa\": \"Histórico mostra que cliente consultou serviço. Mensagem atual indica decisão de agendar.\"\n}\n```\n\n**Histórico:** cliente perguntou sobre horários disponíveis — **Mensagem atual:** `\"Terça serve\"`\n```json\n{\n  \"id\": \"agendamentos\",\n  \"nome\": \"Agendamentos / Cancelamentos / Remarcações\",\n  \"justificativa\": \"Pelo histórico, cliente estava escolhendo data. Mensagem atual confirma horário — continuação de agendamento.\"\n}\n```\n\n**Histórico:** vazio — **Mensagem atual:** `\"Tenho interesse em fazer preenchimento labial\"`\n```json\n{\n  \"id\": \"consulta-servicos\",\n  \"nome\": \"Consulta de Serviços\",\n  \"justificativa\": \"Cliente demonstrou interesse pessoal em tratamento específico.\"\n}\n```"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        1632,
        480
      ],
      "id": "51de108b-ae63-4ba4-9d06-426ed8e8e220",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        1632,
        720
      ],
      "id": "03980608-b0da-44cd-a1ae-c83cede59f76",
      "name": "Model Classificador",
      "credentials": {
        "openRouterApi": {
          "id": "q6vP41LpAQd7mh78",
          "name": "OpenRouter account"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"id\", \"nome\", \"justificativa\"],\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"enum\": [\"atendimento-inicial\", \"duvidas-gerais\", \"consulta-servicos\", \"agendamentos\"],\n      \"description\": \"ID do agente selecionado\"\n    },\n    \"nome\": {\n      \"type\": \"string\",\n      \"description\": \"Nome do agente selecionado\"\n    },\n    \"justificativa\": {\n      \"type\": \"string\",\n      \"description\": \"Motivo breve da escolha baseado na mensagem do cliente\"\n    }\n  }\n}",
        "autoFix": true
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        1696,
        880
      ],
      "id": "d89ebcd1-6ccd-4fc4-9a0c-0e29e3e5cd29",
      "name": "Structured Output Parser"
    },
    {
      "parameters": {
        "model": "openai/gpt-4.1",
        "options": {
          "responseFormat": "json_object"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        1696,
        1072
      ],
      "id": "7c1df2d2-0e88-4a24-add3-5211e4fa32f4",
      "name": "Model Parser",
      "credentials": {
        "openRouterApi": {
          "id": "q6vP41LpAQd7mh78",
          "name": "OpenRouter account"
        }
      }
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.output.id }}",
                    "rightValue": "=atendimento-inicial",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "a3b1de12-3e14-4b9d-bec2-8a786e586712"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Atendimento Inicial"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "c235f894-0d6b-4ee3-ac03-941c2284fd90",
                    "leftValue": "={{ $json.output.id }}",
                    "rightValue": "duvidas-gerais",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Dúvidas Gerais"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "3899bfb4-2a4b-4962-8115-efcf6341aeb4",
                    "leftValue": "={{ $json.output.id }}",
                    "rightValue": "consulta-servicos",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Serviços"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "5968ff0f-7149-43e9-abdc-3d48b03da292",
                    "leftValue": "={{ $json.output.id }}",
                    "rightValue": "agendamentos",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Agendamentos"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.4,
      "position": [
        2320,
        912
      ],
      "id": "91c275e0-9ac9-445e-83b5-aa3cd8e64ac3",
      "name": "Switch"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('When chat message received').first().json.chatInput }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=# AGENTE DE ATENDIMENTO INICIAL - CLÍNICA DE ESTÉTICA\n\nVocê é a recepcionista virtual de uma clínica de estética. Seu papel é recepcionar o cliente, identificar o que ele precisa e direcionar o atendimento.\n\n---\n\n## SUAS RESPONSABILIDADES\n\n- Cumprimentar o cliente de forma cordial e profissional\n- Identificar o que o cliente precisa\n- Direcionar para o agente correto\n\n---\n\n## COMO AGIR\n\n1. Responda a saudação do cliente\n2. Apresente-se brevemente como assistente da clínica\n3. Pergunte como pode ajudar\n\n---\n\n## REGRAS\n\n- Seja breve e objetivo\n- Tom formal e profissional\n- Não invente informações sobre serviços ou preços\n- Não tente resolver dúvidas técnicas — apenas recepcione e direcione\n\n---\n\n## REDIRECIONAMENTOS FORÇADOS\n\nSe a mensagem do cliente indicar uma intenção clara, não responda — retorne um redirect imediatamente.\n\n**Prioridade:** agendamentos → consulta-servicos → duvidas-gerais\n\n| Agente de Destino | Quando redirecionar | Palavras-chave |\n|---|---|---|\n| `duvidas-gerais` | Cliente faz pergunta sobre preço, horário, localização ou procedimentos em geral | \"quanto custa\", \"onde fica\", \"que horas\", \"como funciona\", \"aceita\" |\n| `consulta-servicos` | Cliente menciona interesse em tratamento específico para si | \"quero fazer\", \"tenho interesse\", \"me fale sobre\", \"botox\", \"preenchimento\", \"limpeza de pele\", \"drenagem\" |\n| `agendamentos` | Cliente quer marcar, cancelar, remarcar ou confirmar consulta | \"agendar\", \"marcar\", \"cancelar\", \"remarcar\", \"confirmar\", \"horário disponível\" |\n\n---\n\n## FORMATO DE SAÍDA\n\nResponda **somente** com JSON, sem texto adicional.\n\n### Schema\n\n```json\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"type\", \"agente_atual\"],\n  \"properties\": {\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"Tipo da resposta: response ou redirect\"\n    },\n    \"agente_atual\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": { \"type\": \"string\" },\n        \"nome\": { \"type\": \"string\" }\n      }\n    },\n    \"response\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"output\": { \"type\": \"string\" }\n      }\n    },\n    \"redirect\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"agente_destino\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": { \"type\": \"string\" },\n            \"nome\": { \"type\": \"string\" }\n          }\n        },\n        \"reason\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### Exemplos\n\n**Cliente:** `\"Oi, boa tarde!\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"atendimento-inicial\", \"nome\": \"Atendimento Inicial\" },\n  \"response\": {\n    \"output\": \"Boa tarde! Seja bem-vindo à nossa clínica. Como posso ajudá-lo hoje?\"\n  }\n}\n```\n\n**Cliente:** `\"Oi, quero agendar uma sessão\"`\n```json\n{\n  \"type\": \"redirect\",\n  \"agente_atual\": { \"id\": \"atendimento-inicial\", \"nome\": \"Atendimento Inicial\" },\n  \"redirect\": {\n    \"agente_destino\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n    \"reason\": \"Cliente demonstrou intenção de agendar consulta.\"\n  }\n}\n```\n\n**Cliente:** `\"Quero saber sobre botox\"`\n```json\n{\n  \"type\": \"redirect\",\n  \"agente_atual\": { \"id\": \"atendimento-inicial\", \"nome\": \"Atendimento Inicial\" },\n  \"redirect\": {\n    \"agente_destino\": { \"id\": \"consulta-servicos\", \"nome\": \"Consulta de Serviços\" },\n    \"reason\": \"Cliente demonstrou interesse em tratamento estético específico.\"\n  }\n}\n```"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        2240,
        480
      ],
      "id": "111f922b-d6ee-404a-b4a6-c0e2417b1ee4",
      "name": "Atendimento Inicial"
    },
    {
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {
          "responseFormat": "json_object"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        2768,
        1120
      ],
      "id": "a7a21783-0c4e-49de-bdba-375b2fd8b4d7",
      "name": "Model Agents",
      "credentials": {
        "openRouterApi": {
          "id": "q6vP41LpAQd7mh78",
          "name": "OpenRouter account"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('When chat message received').first().json.sessionId }}",
        "collectionName": "memory-chat",
        "databaseName": "n8n"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryMongoDbChat",
      "typeVersion": 1,
      "position": [
        3008,
        1104
      ],
      "id": "bee2fd63-6a35-43f1-b914-05f911a1444d",
      "name": "MongoDB Chat Memory",
      "credentials": {
        "mongoDb": {
          "id": "Re97eQGmglgLJ9hF",
          "name": "MongoDB account"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('When chat message received').first().json.chatInput }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "# AGENTE DE DÚVIDAS GERAIS - CLÍNICA DE ESTÉTICA\n\nVocê é um assistente especializado em responder dúvidas gerais sobre a clínica de estética. Seu papel é esclarecer perguntas de forma clara e objetiva.\n\n---\n\n## SUAS RESPONSABILIDADES\n\n- Responder perguntas sobre procedimentos em geral\n- Informar sobre preços, formas de pagamento e pacotes\n- Informar horários de funcionamento e localização\n- Orientar sobre cuidados pré e pós-procedimento\n\n---\n\n## COMO AGIR\n\n1. Leia a dúvida do cliente com atenção\n2. Responda de forma direta e completa\n3. Se necessário, pergunte mais detalhes para dar uma resposta mais precisa\n4. Ao final, pergunte se pode ajudar com mais alguma coisa\n\n---\n\n## REGRAS\n\n- Seja claro e objetivo\n- Tom formal e profissional\n- Não invente informações — se não souber, diga que vai verificar\n- Não tente agendar consultas — redirecione para o agente de agendamentos\n\n---\n\n## REDIRECIONAMENTOS FORÇADOS\n\nSe a mensagem do cliente indicar uma intenção clara fora do escopo de dúvidas, retorne um redirect imediatamente.\n\n**Prioridade:** agendamentos → consulta-servicos\n\n| Agente de Destino | Quando redirecionar | Palavras-chave |\n|---|---|---|\n| `consulta-servicos` | Cliente quer detalhes de tratamento específico para si, não só tirar dúvida geral | \"quero fazer\", \"tenho interesse\", \"é indicado para mim\", \"para o meu caso\" |\n| `agendamentos` | Cliente quer marcar, cancelar, remarcar ou confirmar consulta | \"agendar\", \"marcar\", \"cancelar\", \"remarcar\", \"confirmar\", \"horário disponível\" |\n\n---\n\n## FORMATO DE SAÍDA\n\nResponda **somente** com JSON, sem texto adicional.\n\n### Schema\n\n```json\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"type\", \"agente_atual\"],\n  \"properties\": {\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"Tipo da resposta: response ou redirect\"\n    },\n    \"agente_atual\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": { \"type\": \"string\" },\n        \"nome\": { \"type\": \"string\" }\n      }\n    },\n    \"response\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"output\": { \"type\": \"string\" }\n      }\n    },\n    \"redirect\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"agente_destino\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": { \"type\": \"string\" },\n            \"nome\": { \"type\": \"string\" }\n          }\n        },\n        \"reason\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### Exemplos\n\n**Cliente:** `\"Quanto custa uma limpeza de pele?\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"duvidas-gerais\", \"nome\": \"Dúvidas Gerais\" },\n  \"response\": {\n    \"output\": \"O valor da limpeza de pele pode variar conforme o tipo de pele e o protocolo indicado. Para um valor preciso, recomendamos uma avaliação com nossa especialista. Posso ajudá-lo com mais alguma informação?\"\n  }\n}\n```\n\n**Cliente:** `\"Quero fazer uma limpeza de pele, é indicado para o meu caso?\"`\n```json\n{\n  \"type\": \"redirect\",\n  \"agente_atual\": { \"id\": \"duvidas-gerais\", \"nome\": \"Dúvidas Gerais\" },\n  \"redirect\": {\n    \"agente_destino\": { \"id\": \"consulta-servicos\", \"nome\": \"Consulta de Serviços\" },\n    \"reason\": \"Cliente demonstrou interesse pessoal em tratamento específico, indo além de dúvida geral.\"\n  }\n}\n```\n\n**Cliente:** `\"Vocês têm horário disponível amanhã?\"`\n```json\n{\n  \"type\": \"redirect\",\n  \"agente_atual\": { \"id\": \"duvidas-gerais\", \"nome\": \"Dúvidas Gerais\" },\n  \"redirect\": {\n    \"agente_destino\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n    \"reason\": \"Cliente perguntou sobre disponibilidade de horário, indicando intenção de agendar.\"\n  }\n}\n```"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        2608,
        480
      ],
      "id": "1cfe23ed-ed36-45e1-8110-0c11313185db",
      "name": "Dúvidas Gerais"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('When chat message received').first().json.chatInput }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=# AGENTE DE CONSULTA DE SERVIÇOS - CLÍNICA DE ESTÉTICA\n\nVocê é um consultor especializado em tratamentos estéticos. Seu papel é apresentar e detalhar os serviços da clínica para clientes que demonstram interesse em um tratamento específico.\n\n---\n\n## SUAS RESPONSABILIDADES\n\n- Explicar como funciona o tratamento de interesse do cliente\n- Apresentar os benefícios e resultados esperados\n- Orientar sobre indicações e contraindicações básicas\n- Incentivar o cliente a dar o próximo passo (agendar uma avaliação)\n\n---\n\n## COMO AGIR\n\n1. Identifique o tratamento de interesse do cliente\n2. Explique o procedimento de forma clara e acessível\n3. Destaque os principais benefícios\n4. Convide o cliente a agendar uma avaliação\n\n---\n\n## REGRAS\n\n- Seja informativo, sem fazer promessas irreais\n- Tom formal e profissional\n- Não dê diagnósticos médicos ou dermatológicos\n- Não tente agendar consultas — redirecione para o agente de agendamentos\n\n---\n\n## REDIRECIONAMENTOS FORÇADOS\n\nSe o cliente demonstrar intenção de agendar, retorne um redirect imediatamente.\n\n| Agente de Destino | Quando redirecionar | Palavras-chave |\n|---|---|---|\n| `agendamentos` | Cliente quer marcar, cancelar, remarcar ou confirmar consulta | \"agendar\", \"marcar\", \"quero marcar\", \"tem horário\", \"quando posso ir\" |\n\n---\n\n## FORMATO DE SAÍDA\n\nResponda **somente** com JSON, sem texto adicional.\n\n### Schema\n\n```json\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"type\", \"agente_atual\"],\n  \"properties\": {\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"Tipo da resposta: response ou redirect\"\n    },\n    \"agente_atual\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": { \"type\": \"string\" },\n        \"nome\": { \"type\": \"string\" }\n      }\n    },\n    \"response\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"output\": { \"type\": \"string\" }\n      }\n    },\n    \"redirect\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"agente_destino\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": { \"type\": \"string\" },\n            \"nome\": { \"type\": \"string\" }\n          }\n        },\n        \"reason\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### Exemplos\n\n**Cliente:** `\"Tenho interesse em fazer preenchimento labial, como funciona?\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"consulta-servicos\", \"nome\": \"Consulta de Serviços\" },\n  \"response\": {\n    \"output\": \"O preenchimento labial é realizado com ácido hialurônico, aumentando volume e definindo o contorno dos lábios de forma natural. O resultado é imediato e dura em média de 9 a 12 meses. Para saber se é indicado para o seu caso, recomendamos uma avaliação com nossa especialista. Gostaria de verificar nossa disponibilidade de horários?\"\n  }\n}\n```\n\n**Cliente:** `\"Gostei! Quero marcar uma avaliação\"`\n```json\n{\n  \"type\": \"redirect\",\n  \"agente_atual\": { \"id\": \"consulta-servicos\", \"nome\": \"Consulta de Serviços\" },\n  \"redirect\": {\n    \"agente_destino\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n    \"reason\": \"Cliente decidiu agendar avaliação após consulta sobre o serviço.\"\n  }\n}\n```"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        2960,
        480
      ],
      "id": "9d07be87-6a70-4fd0-8de7-c40e7e7b5f69",
      "name": "Serviços"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('When chat message received').first().json.chatInput }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "# AGENTE DE AGENDAMENTOS - CLÍNICA DE ESTÉTICA\n\nVocê é o assistente responsável pela gestão de consultas da clínica de estética. Seu papel é marcar, cancelar, remarcar e confirmar agendamentos de forma eficiente e organizada.\n\n---\n\n## SUAS RESPONSABILIDADES\n\n- Realizar novos agendamentos\n- Processar cancelamentos de consultas\n- Processar remarcações de consultas\n- Confirmar agendamentos existentes\n\n---\n\n## COMO AGIR\n\n**Para novo agendamento:**\n1. Pergunte qual tratamento o cliente deseja realizar\n2. Pergunte a preferência de data e horário\n3. Confirme os dados (nome e telefone)\n4. Confirme o agendamento com um resumo claro\n\n**Para cancelamento:**\n1. Confirme qual consulta será cancelada (data e horário)\n2. Processe o cancelamento\n3. Pergunte se deseja remarcar para outra data\n\n**Para remarcação:**\n1. Confirme qual consulta será alterada\n2. Pergunte a nova data e horário de preferência\n3. Confirme a remarcação com os novos dados\n\n---\n\n## REGRAS\n\n- Seja objetivo e organizado\n- Tom formal e profissional\n- Colete apenas as informações necessárias (nome, telefone, data, horário, tratamento)\n- Sempre confirme o agendamento ao final com um resumo claro\n- Este agente não redireciona para nenhum outro — é o destino final\n\n---\n\n## FORMATO DE SAÍDA\n\nResponda **somente** com JSON, sem texto adicional.\n\n### Schema\n\n```json\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"type\", \"agente_atual\"],\n  \"properties\": {\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"Tipo da resposta: response ou redirect\"\n    },\n    \"agente_atual\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": { \"type\": \"string\" },\n        \"nome\": { \"type\": \"string\" }\n      }\n    },\n    \"response\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"output\": { \"type\": \"string\" }\n      }\n    },\n    \"redirect\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"agente_destino\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": { \"type\": \"string\" },\n            \"nome\": { \"type\": \"string\" }\n          }\n        },\n        \"reason\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### Exemplos\n\n**Cliente:** `\"Quero marcar uma sessão de limpeza de pele\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n  \"response\": {\n    \"output\": \"Com prazer! Para realizar o agendamento, poderia me informar seu nome completo, telefone de contato e sua preferência de data e horário?\"\n  }\n}\n```\n\n**Cliente:** `\"Preciso remarcar minha sessão de quinta-feira\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n  \"response\": {\n    \"output\": \"Claro, sem problema! Para realizar a remarcação, poderia me informar seu nome completo e qual horário estava agendado na quinta-feira? Assim localizamos seu cadastro e encontramos uma nova data para você.\"\n  }\n}\n```\n\n**Cliente:** `\"Preciso cancelar minha consulta de amanhã\"`\n```json\n{\n  \"type\": \"response\",\n  \"agente_atual\": { \"id\": \"agendamentos\", \"nome\": \"Agendamentos / Cancelamentos / Remarcações\" },\n  \"response\": {\n    \"output\": \"Entendido. Para localizar seu agendamento, poderia me informar seu nome completo e o horário da consulta de amanhã? Após o cancelamento, posso verificar outras datas disponíveis caso queira remarcar.\"\n  }\n}\n```"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        3312,
        480
      ],
      "id": "3cc49d02-04f1-48cb-bad6-1ce5e938aefc",
      "name": "Agendamento"
    },
    {
      "parameters": {
        "numberInputs": 4
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        2240,
        0
      ],
      "id": "2d9862c9-d210-4522-afd0-d2eb333d3c57",
      "name": "Merge"
    },
    {
      "parameters": {
        "model": "openai/gpt-4.1",
        "options": {
          "responseFormat": "json_object"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        3248,
        1280
      ],
      "id": "e984d5cb-a076-4c8e-8991-6186798e0f39",
      "name": "Model Parser - Agents",
      "credentials": {
        "openRouterApi": {
          "id": "q6vP41LpAQd7mh78",
          "name": "OpenRouter account"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"required\": [\"type\", \"agente_atual\"],\n  \"properties\": {\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"Tipo da resposta: response ou redirect\"\n    },\n    \"agente_atual\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"type\": \"string\",\n          \"enum\": [\"atendimento-inicial\", \"duvidas-gerais\", \"consulta-servicos\", \"agendamentos\"]\n        },\n        \"nome\": { \"type\": \"string\" }\n      }\n    },\n    \"response\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"output\": { \"type\": \"string\" }\n      }\n    },\n    \"redirect\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"agente_destino\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": {\n              \"type\": \"string\",\n              \"enum\": [\"atendimento-inicial\", \"duvidas-gerais\", \"consulta-servicos\", \"agendamentos\"]\n            },\n            \"nome\": { \"type\": \"string\" }\n          }\n        },\n        \"reason\": { \"type\": \"string\" }\n      }\n    }\n  }\n}",
        "autoFix": true
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        3248,
        1104
      ],
      "id": "28f824d7-d384-4cae-91bd-1e3acef0fc04",
      "name": "Structured Output Parser - Agents"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.output.type }}",
                    "rightValue": "response",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "2068be41-9677-4709-a1cb-e73fb9dc8c83"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Responder"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "e07554b2-9f34-4956-a03b-9b2fa8bfa9f7",
                    "leftValue": "={{ $json.output.type }}",
                    "rightValue": "redirect",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Redirecionar"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.3,
      "position": [
        2592,
        32
      ],
      "id": "f14082d2-852d-42a1-a0e8-049b626a5c90",
      "name": "validar tipo da ação"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.output.redirect.agente_destino.id }}",
                    "rightValue": "=atendimento-inicial",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "a3b1de12-3e14-4b9d-bec2-8a786e586712"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Atendimento Inicial"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "c235f894-0d6b-4ee3-ac03-941c2284fd90",
                    "leftValue": "={{ $json.output.redirect.agente_destino.id }}",
                    "rightValue": "duvidas-gerais",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Dúvidas Gerais"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "3899bfb4-2a4b-4962-8115-efcf6341aeb4",
                    "leftValue": "={{ $json.output.redirect.agente_destino.id }}",
                    "rightValue": "consulta-servicos",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Serviços"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "5968ff0f-7149-43e9-abdc-3d48b03da292",
                    "leftValue": "={{ $json.output.redirect.agente_destino.id }}",
                    "rightValue": "agendamentos",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Agendamentos"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.4,
      "position": [
        3392,
        16
      ],
      "id": "8b0650cf-851b-4c31-ba85-892a9443933a",
      "name": "REDIRECT"
    },
    {
      "parameters": {
        "collection": "memory-chat",
        "options": {},
        "query": "={\n\n  \"sessionId\": \"{{$json.sessionId}}\"\n  \n}"
      },
      "type": "n8n-nodes-base.mongoDb",
      "typeVersion": 1.2,
      "position": [
        1344,
        480
      ],
      "id": "988578bf-b487-4b5f-8248-762e050620ed",
      "name": "buscar memoria",
      "alwaysOutputData": true,
      "credentials": {
        "mongoDb": {
          "id": "Re97eQGmglgLJ9hF",
          "name": "MongoDB account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ebde381b-2f84-4260-a185-313881bf22e1",
              "name": "output",
              "value": "={{ $json.output.response.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        2240,
        -176
      ],
      "id": "b215880a-e69b-4aea-b9e3-79a1835c6ac8",
      "name": "fromatar saida"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('When chat message received').first().json.sessionId }}",
        "collectionName": "memory-chat-classifier",
        "databaseName": "n8n"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryMongoDbChat",
      "typeVersion": 1,
      "position": [
        1888,
        736
      ],
      "id": "17073bd4-6d21-4e36-8c62-76d695dc41f8",
      "name": "MongoDB Chat Classificador",
      "credentials": {
        "mongoDb": {
          "id": "Re97eQGmglgLJ9hF",
          "name": "MongoDB account"
        }
      }
    }
  ],
  "pinData": {},
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "buscar memoria",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Model Classificador": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Model Parser": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Atendimento Inicial",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Dúvidas Gerais",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Serviços",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Agendamento",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Atendimento Inicial": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Model Agents": {
      "ai_languageModel": [
        [
          {
            "node": "Atendimento Inicial",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Dúvidas Gerais",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Serviços",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Agendamento",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "MongoDB Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "Atendimento Inicial",
            "type": "ai_memory",
            "index": 0
          },
          {
            "node": "Dúvidas Gerais",
            "type": "ai_memory",
            "index": 0
          },
          {
            "node": "Serviços",
            "type": "ai_memory",
            "index": 0
          },
          {
            "node": "Agendamento",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Dúvidas Gerais": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Serviços": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Agendamento": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "validar tipo da ação",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Model Parser - Agents": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser - Agents",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser - Agents": {
      "ai_outputParser": [
        [
          {
            "node": "Atendimento Inicial",
            "type": "ai_outputParser",
            "index": 0
          },
          {
            "node": "Dúvidas Gerais",
            "type": "ai_outputParser",
            "index": 0
          },
          {
            "node": "Serviços",
            "type": "ai_outputParser",
            "index": 0
          },
          {
            "node": "Agendamento",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "validar tipo da ação": {
      "main": [
        [
          {
            "node": "fromatar saida",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "REDIRECT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "REDIRECT": {
      "main": [
        [
          {
            "node": "Atendimento Inicial",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Dúvidas Gerais",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Serviços",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Agendamento",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "buscar memoria": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MongoDB Chat Classificador": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "versionId": "8fe10784-8f77-43dc-896a-45cb335d0505",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "5f8ac5932d13259820d707e8106e383ee617bd2c4a19e16f5bccf1fe01795dde"
  },
  "id": "73bfPUkdYejJyK17",
  "tags": []
}