[N8N Agents]

Describe the problem/error/question

What is the error message (if any)?

Error in sub-node ‘Memory‘

input values have 3 keys, you must specify an input key or pass only 1 key as input

Please share your workflow

{
  "nodes": [
    {
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "query"
            },
            {
              "name": "data",
              "type": "object"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        520,
        180
      ],
      "id": "7460bfd0-4f48-4d1c-b6e8-389f5467eee6",
      "name": "exec prod"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('exec prod').first().json.data.meta.identifier }}",
        "sessionTTL": "=86400",
        "contextWindowLength": 500
      },
      "type": "@n8n/n8n-nodes-langchain.memoryRedisChat",
      "typeVersion": 1.4,
      "position": [
        920,
        400
      ],
      "id": "7f61beb4-8d33-4568-8f1d-d89d21f2c2cf",
      "name": "Memory",
      "notesInFlow": false,
      "credentials": {
        "redis": {
          "id": "DkFec87eNEk7u7Ce",
          "name": "Redis account"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {
          "temperature": 0.2
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        740,
        400
      ],
      "id": "154a39b9-ce59-4914-ada0-0d213795d5de",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "id": "IhfMw3EJ0uBW67Ae",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "description": "Armazenar informações importantes da conversa",
        "workflowId": {
          "__rl": true,
          "value": "PCUYViCNQe3Db3D3",
          "mode": "list",
          "cachedResultName": "TOOL - MEMORY LONG"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "campo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('campo', `Nome do campo que será salvo o dado`, 'string') }}",
            "identifier": "={{ $('exec prod').item.json.data.meta.identifier }}",
            "valor": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('valor', `Valor a ser salvo no campo`, 'string') }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "identifier",
              "displayName": "identifier",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "campo",
              "displayName": "campo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "valor",
              "displayName": "valor",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        1060,
        400
      ],
      "id": "c42b75ad-cc07-40ca-8271-cd49b9cb1b42",
      "name": "MEMORY LONG"
    },
    {
      "parameters": {
        "description": "Após finalizar coleta de dados do usuário, utilizar essa ferramenta para atualizar os dados no chatwoot",
        "workflowId": {
          "__rl": true,
          "value": "mKFISH9UAfiZxfDR",
          "mode": "list",
          "cachedResultName": "TOOL - ATUALIZAR DADOS DO CONTATO"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "data": "={{ $('exec prod').item.json.data }}",
            "email": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('email', ``, 'string') }}",
            "localidade": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('localidade', `localidade`, 'string') }}",
            "localidade_setor": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('localidade_setor', `localidade_setor`, 'string') }}",
            "matricula": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('matricula', `matricula`, 'string') }}",
            "localidade_telefone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('localidade_telefone', `localidade_telefone`, 'string') }}",
            "cargo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cargo', `cargo`, 'string') }}"
          },
          "matchingColumns": [
            "data"
          ],
          "schema": [
            {
              "id": "data",
              "displayName": "data",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "object",
              "removed": false
            },
            {
              "id": "email",
              "displayName": "email",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "localidade",
              "displayName": "localidade",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "localidade_setor",
              "displayName": "localidade_setor",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "matricula",
              "displayName": "matricula",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "localidade_telefone",
              "displayName": "localidade_telefone",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "cargo",
              "displayName": "cargo",
              "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": [
        1260,
        400
      ],
      "id": "7aebc3c8-c039-44f1-bf97-cf8b9b4198c8",
      "name": "ATUALIZAR_CONTATO"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.query }}",
        "options": {
          "systemMessage": "=<prompt id=\"agente_atendimento_inicial\">\n  <papel>\n    Você é um agente responsável por realizar o primeiro atendimento do usuário. Sua função é coletar e armazenar, um a um, os dados iniciais de identificação.\n  </papel>\n\n  <acoes_sequenciais>\n\n    <acao id=\"saudacao\">\n      <descricao>Faça uma saudação receptiva ao usuário</descricao>\n      <pergunta>Olá! Sou a DIANA, a assistente inteligente da Prefeitura de Diadema para abertura de chamados de suporte de TI. Para que possamos seguir com seu atendimento vou precisar que responda algumas perguntas.</pergunta>\n    </acao>\n\n    <acao id=\"perguntar_nome\">\n      <descricao>Pergunte o nome completo do usuário.</descricao>\n      <pergunta>Qual o seu nome completo?</pergunta>\n      <salvar_em>nome</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_localidade\">\n      <descricao>Solicite a localidade onde o usuário atua.</descricao>\n      <pergunta>Qual a sua localidade ou Secretaria?</pergunta>\n      <salvar_em>localidade</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_setor\">\n      <descricao>Solicite o setor ou unidade do usuário.</descricao>\n      <pergunta>Dentro da sua localidade ou Secretaria, qual o seu setor, divisão ou sala?</pergunta>\n      <salvar_em>localidade_setor</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_matricula\">\n      <descricao>Solicite a matrícula (se aplicável). Caso o usuário não tenha, salve como \"\".</descricao>\n      <pergunta>Qual o número do seu prontuário ou matrícula? (caso tenha)</pergunta>\n      <salvar_em>matricula</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_cargo\">\n      <descricao>Solicite o cargo do usuário</descricao>\n      <pergunta>Qual é seu cargo na sua secretaria?</pergunta>\n      <salvar_em>cargo</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_telefone_localidade\">\n      <condicao>\n        {{ $json.data.meta.sender.custom_attributes.is_fixo }} == false\n      </condicao>\n      <descricao>Solicite o telefone fixo da localidade, exceto se o contato for de número fixo.</descricao>\n      <pergunta>Qual o telefone de contato da sua localidade?</pergunta>\n      <salvar_em>localidade_telefone</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n    \n    <acao id=\"usar_identifier_como_telefone\">\n      <condicao>\n        {{ $json.data.meta.sender.custom_attributes.is_fixo }} == true\n      </condicao>\n      <descricao>Utilize o telefone de contato como telefone da localidade, pois o contato foi feito de um número fixo.</descricao>\n      <atribuir>\n        localidade_telefone = {{ $json.data.meta.phoneNumber }}\n      </atribuir>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"perguntar_email\">\n      <descricao>Solicite o e-mail para contato</descricao>\n      <pergunta>Por fim, qual é o seu e-mail para contato? De preferência que seja @diadema.sp.gov.br</pergunta>\n      <salvar_em>email</salvar_em>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"atualizar_dados_contato\">\n      <descricao>Atualizar os dados do usuário no sistema após a coleta das informações.</descricao>\n      <ferramenta>ATUALIZAR_CONTATO</ferramenta>\n    </acao>\n\n    <acao id=\"finalizar_triagem\">\n      <descricao>Finalizar triagem</descricao>\n      <atribuir>\n        triagem_finalizada = true\n      </atribuir>\n      <ferramenta>memory_long</ferramenta>\n    </acao>\n\n    <acao id=\"motivo_contato\">\n      <descricao>Perguntar ao usuário o motivo do contato.</descricao>\n      <pergunta>Seus dados foram salvos com sucesso. Para registrar o chamado, peço que descreva sua solicitação.</pergunta>\n    </acao>\n\n  </acoes_sequenciais>\n\n  <regras>\n    - **Após cada resposta do usuário, armazene imediatamente o valor recebido no campo correspondente, usando a ferramenta memory_long, ANTES de realizar qualquer próxima ação ou pergunta. Não aguarde o término da coleta para salvar**.\n    - **Nunca** faça duas perguntas ao mesmo tempo, realize uma ação por vez.\n    - Sua função é **apenas coletar dados de identificação inicial**. Não registre chamados, não faça diagnósticos e não interprete solicitações.\n    - **A ferramenta `ATUALIZAR_CONTATO` deve obrigatoriamente ser executada ao final da coleta de dados.**\n    - **Sempre armazene true no campo `triagem_finalizada` com a ferramenta `memory_long` ao finalizar a coleta dos dados de identificação**.\n    - Nunca pule etapas, mesmo que o usuário antecipe as informações.\n    - Após executar `ATUALIZAR_CONTATO`, **finalize informando que os dados foram salvos com sucesso** e **incentive o usuário a descrever sua solicitação para continuidade do atendimento**.\n    - Caso o usuário envie qualquer solicitação de problema após o fim da coleta, **não responda nem encaminhe**. Apenas reforce que ele deve reenviar sua solicitação.\n  </regras>\n</prompt>",
          "returnIntermediateSteps": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        800,
        180
      ],
      "id": "5109a930-40d1-4974-bedf-c4e8e2704102",
      "name": "AGENT - ATENDIMENTO INICIAL"
    }
  ],
  "connections": {
    "exec prod": {
      "main": [
        [
          {
            "node": "AGENT - ATENDIMENTO INICIAL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "AGENT - ATENDIMENTO INICIAL",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AGENT - ATENDIMENTO INICIAL",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "MEMORY LONG": {
      "ai_tool": [
        [
          {
            "node": "AGENT - ATENDIMENTO INICIAL",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "ATUALIZAR_CONTATO": {
      "ai_tool": [
        [
          {
            "node": "AGENT - ATENDIMENTO INICIAL",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AGENT - ATENDIMENTO INICIAL": {
      "main": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "2a754ec282f18a46e17a0928dbbc6d2079b520cdfeb082947833c3b8ec05a9b9"
  }
}

Share the output returned by the last node

Error in sub-node ‘Memory‘
input values have 3 keys, you must specify an input key or pass only 1 key as input

Information on your n8n setup

  • n8n version: 1.97.1
  • Database (default: SQLite): Postgres
  • n8n EXECUTIONS_PROCESS setting (default: own, main): default
  • Running n8n via (Docker, npm, n8n cloud, desktop app): Docker
  • Operating system: Ubuntu