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