{
  "active": true,
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Vari\u00e1veis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Vari\u00e1veis": {
      "main": [
        [
          {
            "node": "Set Agent Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Agent Input": {
      "main": [
        [
          {
            "node": "Professor de Espanhol Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Professor de Espanhol Agent": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Professor de Espanhol Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "Professor de Espanhol Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Parser Chain": {
      "main": [
        [
          {
            "node": "Split Out Messages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI LLM for Parser": {
      "ai_languageModel": [
        [
          {
            "node": "Parser Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OutputParser": {
      "ai_outputParser": [
        [
          {
            "node": "Parser Chain",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Messages": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        []
      ]
    },
    "Respond to Webhook": {
      "main": [
        []
      ]
    }
  },
  "createdAt": "2025-11-14T07:02:41.055Z",
  "id": "RF1foNCnpcSdJ9t6",
  "isArchived": false,
  "meta": null,
  "name": "IA Professor de Espanhol de Tecnologia (Fixed)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "profesor-espanol",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "25b7edc9-8ad4-4fe8-8999-fcd82f5d9d24",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -960,
        384
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "8d88c137-383f-4307-b3cc-1f6a560ea67b",
              "name": "mobile",
              "value": "={{ $json.body.data?.key?.remoteJid?.split(':')[0] || 'unknown' }}",
              "type": "string"
            },
            {
              "id": "7e2f520e-4952-425b-82ca-792cc46680d4",
              "name": "mensagem",
              "value": "={{ $json.body.message || '' }}",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "f6c0fc9e-70a6-4732-ad36-9a1f8fb7e908",
      "name": "Vari\u00e1veis",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -752,
        384
      ],
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "unique-sessionid-assignment",
              "name": "sessionId",
              "value": "={{ $json.body.message }}",
              "type": "string"
            },
            {
              "id": "unique-listamensagens-assignment",
              "name": "listaMensagens",
              "value": "={{ $('Vari\u00e1veis').item.json.mensagem }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "ec768138-51b9-4ad6-8c3e-2662b1681b97",
      "name": "Set Agent Input",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -560,
        384
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.listaMensagens }}",
        "options": {
          "systemMessage": "## Vis\u00e3o Geral\nVoc\u00ea \u00e9 um professor de espanhol amig\u00e1vel e experiente, especializado em ensinar espanhol para profissionais de tecnologia. Seu nome \u00e9 \"Profesor Sabelotodo\". Sua miss\u00e3o \u00e9 ajudar os alunos a dominar o vocabul\u00e1rio e as frases comuns no mundo da TI, programa\u00e7\u00e3o, hardware, software e inova\u00e7\u00e3o digital.\n\n## Diretrizes de Ensino\n1.  **Sauda\u00e7\u00e3o Inicial:** Sempre se apresente na primeira intera\u00e7\u00e3o com um novo aluno. Exemplo: \"\u00a1Hola! Soy el Profesor Sabelotodo, tu tutor de espa\u00f1ol para el mundo de la tecnolog\u00eda. \u00bfEn qu\u00e9 podemos trabajar hoy?\".\n2.  **Corre\u00e7\u00e3o Construtiva:** Corrija os erros de gram\u00e1tica e vocabul\u00e1rio do aluno de forma gentil. Explique o porqu\u00ea da corre\u00e7\u00e3o. Exemplo: \"Casi perfecto. En espa\u00f1ol, dir\u00edamos 'El *c\u00f3digo fuente* es muy limpio' en lugar de 'El *c\u00f3digo de fuente*'. La preposici\u00f3n 'de' no es necesaria aqu\u00ed. \u00a1Buen intento!\".\n3.  **Ensino Proativo:** Introduza novos termos t\u00e9cnicos em espanhol de forma contextual. Pe\u00e7a ao aluno para criar uma frase com a nova palavra. Exemplo: \"\u00bfConoces la palabra 'depurar'? Significa 'to debug'. \u00bfPodr\u00edas intentar usar 'depurar' en una frase sobre programaci\u00f3n?\".\n4.  **Exerc\u00edcios Pr\u00e1ticos:** Proponha pequenos desafios, como:\n    *   Traduzir uma frase t\u00e9cnica do portugu\u00eas/ingl\u00eas para o espanhol.\n    *   Descrever um conceito de tecnologia (ex: \"la nube\" - cloud) em espanhol.\n    *   Perguntar sobre as ferramentas que o aluno usa no dia a dia e ensin\u00e1-lo os nomes em espanhol (ex: \"repositorio\", \"entorno de desarrollo\", \"base de datos\").\n5.  **Tom e Personalidade:** Seja paciente, encorajador e um pouco \"nerd\" sobre tecnologia. Use emojis para tornar a conversa mais leve. \ud83e\udd13\ud83d\udca1\ud83d\udcbb\n6.  **Manter o Foco:** Mantenha a conversa centrada em t\u00f3picos de tecnologia. Se o aluno desviar muito do assunto, traga-o de volta gentilmente. Exemplo: \"\u00a1Qu\u00e9 interesante! Y hablando de organizaci\u00f3n, \u00bfsabes c\u00f3mo se dice 'project management' en espa\u00f1ol? Se dice 'gesti\u00f3n de proyectos'\".\n7.  **Mem\u00f3ria:** Lembre-se das conversas anteriores para criar uma experi\u00eancia de aprendizado cont\u00ednua. Fa\u00e7a refer\u00eancia a termos ou erros que o aluno cometeu no passado.\n\n## Regras\n- Responda sempre em espanhol, a menos que o aluno pe\u00e7a explicitamente uma tradu\u00e7\u00e3o ou explica\u00e7\u00e3o em portugu\u00eas.\n- Mantenha as respostas relativamente curtas e focadas, ideais para um formato de chat.\n- Nunca use ferramentas externas como agendamento ou envio de e-mails. Sua \u00fanica fun\u00e7\u00e3o \u00e9 ensinar espanhol."
        }
      },
      "id": "bab13916-2205-4011-ad0e-2d5526bcc21e",
      "name": "Professor de Espanhol Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.6,
      "position": [
        -368,
        384
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1,
      "position": [
        -464,
        608
      ],
      "id": "07aa69e8-2646-471c-be0c-f982b7037350",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Vari\u00e1veis').item.json.mensagem }}",
        "contextWindowLength": 20
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        -304,
        592
      ],
      "id": "52904a16-6807-4603-a60c-f243568e5a68",
      "name": "Postgres Chat Memory",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Whatsapp message to be splitted and formated: {{ $json.output }}",
        "hasOutputParser": true,
        "messages": {
          "messageValues": [
            {
              "message": "=Por favor, gere a sa\u00edda no seguinte formato JSON:\n{\n  \"messages\": [\n    \"splitedMessage\",\n    \"splitedMessage\",\n    \"splitedMessage\"\n  ]\n}\n\nAs mensagens devem ser divididas de forma natural, afinal estamos conversando com um humano, n\u00e3o \u00e9 mesmo?\n\nCertifique-se de que a resposta siga exatamente essa estrutura, incluindo os colchetes e as aspas.\n\n### Jamais separe uma mensagem vazia.\n\n### Certifique-se de que a resposta siga exatamente essa estrutura abaixo, deixando somente entre '*' para negrito e nunca fugindo das demais regras de markdown do whatsapp:\n\t\t\t- *negrito* (substitua '**' por '*')\n\t\t\t- ~tachado~ (caso seja algo que foi exclu\u00eddo ou alterado)\n\t\t\t- _it\u00e1lico_.(extremamente raro)\n            - `link` (usar sempre em todos os links)\n\nTudo o que for link, pode colocar entre \"`\", ou seja, na seguinte formata\u00e7\u00e3o: `www.link.com.br`\n"
            }
          ]
        }
      },
      "id": "1cf6c3d4-7d2f-4637-8a57-c27ccae80f0e",
      "name": "Parser Chain",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        -64,
        384
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "759359e8-adb2-4bdf-8f20-50159a7eda4e",
      "name": "OpenAI LLM for Parser",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1,
      "position": [
        -80,
        576
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"messages\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    }\n  },\n  \"required\": [\"messages\"]\n}"
      },
      "id": "04eaf694-168f-4b95-b0f4-c3c0966f34bf",
      "name": "OutputParser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        64,
        592
      ]
    },
    {
      "parameters": {
        "fieldToSplitOut": "output.messages",
        "options": {
          "destinationFieldName": "output"
        }
      },
      "id": "4a4d328b-7629-48ed-b624-6ed3b4d958be",
      "name": "Split Out Messages",
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        240,
        384
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "cb8570cd-f81b-438c-8a77-7fff247304d2",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        448,
        384
      ]
    },
    {
      "parameters": {
        "amount": 1.5
      },
      "id": "aa5a2c47-5512-4031-ac2a-980ad8bd4e0d",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        640,
        384
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        -16,
        224
      ],
      "id": "09d82eb9-2cde-4256-b407-7de9ff62c077",
      "name": "Respond to Webhook"
    }
  ],
  "repo_name": "backup-n8n",
  "repo_owner": "faelsou",
  "repo_path": "backups/RF1foNCnpcSdJ9t6",
  "settings": {
    "executionOrder": "v1"
  },
  "shared": [
    {
      "createdAt": "2025-11-14T07:02:41.055Z",
      "updatedAt": "2025-11-14T07:02:41.055Z",
      "role": "workflow:owner",
      "workflowId": "RF1foNCnpcSdJ9t6",
      "projectId": "uxvBhUmI1Fx6jdU7"
    }
  ],
  "staticData": null,
  "tags": [],
  "triggerCount": 1,
  "updatedAt": "2025-11-14T07:27:41.760Z",
  "versionId": "271c4bce-0a63-4c6a-9637-b1f58f868307"
}