Describe the problem/error/question
Getting NULL row upserts using supabase tool. Tried changing the field mapping. Version 1.78.0
What is the error message (if any)?
No errors, just upserting NULL on supabase
Please share your workflow
(Select the nodes on your canvas and use the keyboard shortcuts CMD+C/CTRL+C and CMD+V/CTRL+V to copy and paste the workflow.)
```{
"nodes": [
{
"parameters": {
"options": {
"systemMessage": "Você é um assistente de treinos que processa inputs de treino para extrair, mapear e registrar os dados sem interagir com o usuário para obter informações adicionais. Utilize as duas tabelas abaixo para realizar o mapeamento e registro:\n\nTabela: Plano de Treinos (Base de Treinos Padrão)\n\nObjetivo:\nContém o plano padronizado, com todos os exercícios mapeados, seus códigos, grupos musculares, subgrupos e informações padrão (como séries e repetições).\nCampos Disponíveis:\nID_Treino\nNome_Treino\nCódigo_Exercício\nNome_Exercício\nSeries\nRepetições\nGrupo_Muscular\nSubgrupo_Muscular\nNotas\nTabela: Registros de Treinos\n\nObjetivo:\nArmazena os registros dos exercícios realizados, contendo data, dados do exercício, séries, repetições, carga, flags e observações.\nCampos Disponíveis:\nData\nID_Treino\nCódigo_Exercício\nNome_Exercício\nGrupo_Muscular\nSubgrupo_Muscular\nSéries\nRepetições\nCarga\nFlag_Fora_da_Base\nFlag_Dados_Faltantes\nObservações\nFluxo de Trabalho e Comportamento Esperado\nExtração de Dados do Input\n\nObjetivo: Extraia, a partir do texto recebido, os dados de cada exercício mencionado.\nDados a Extrair:\nNome do Exercício: Identifique o exercício (ex.: \"Supino\", \"Bíceps na Roldana\").\nRepetições e Séries: Extraia os números informados, se presentes.\nCarga: Utilize o valor informado, considerando que já se trata do peso total (não é necessário separar o peso da barra).\nTécnicas ou Variações: Por exemplo, \"dropset\" ou outras variações informadas.\nMapeamento com a Base de Treinos\n\nLocalização:\nProcure o Nome_Exercício extraído na Tabela: Plano de Treinos para obter os dados padronizados (código, ID_Treino, Grupo_Muscular, Subgrupo_Muscular, séries e repetições padrão).\nCaso Dados Diferentes no Input:\nSe o input especificar valores diferentes dos padrões (por exemplo, número de séries ou repetições), utilize os dados informados, mas mantenha o mapeamento do exercício.\nNovo Exercício:\nSe o exercício não for encontrado na base, registre-o marcando o campo Flag_Fora_da_Base (por exemplo, com \"Sim\") e classifique-o como correspondente a um novo exercício.\nRegistro e Formatação da Saída\n\nMontagem do Registro:\nPreencha os campos para cada exercício de acordo com a Tabela: Registros de Treinos:\nData: Data atual ou conforme informado.\nID_Treino e Código_Exercício: Obtidos a partir do mapeamento na base.\nNome_Exercício: Nome padronizado da base.\nGrupo_Muscular e Subgrupo_Muscular: Conforme a base.\nSéries e Repetições: Utilize os valores padrão da base, a não ser que o input especifique alterações.\nCarga: Conforme informado no input.\nFlag_Dados_Faltantes: Se algum dado essencial não for identificado no input, marque este campo.\nObservações: Inclua informações adicionais extraídas (ex.: técnica “dropset”).\nContagem de Exercícios:\nSe o input contiver 6 exercícios, garanta que o output inclua o número total de exercícios processados.\nRetorno para o Próximo Assistente\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
160,
-100
],
"id": "1ac4cbcd-14f9-409f-900f-69a17b72fef6",
"name": "AI Agent"
},
{
"parameters": {
"model": "gpt-4o",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.1,
"position": [
160,
220
],
"id": "83ef6c9a-cd84-4af3-a92c-2bd37b99306e",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"id": "romEH8gU5oKlRFND",
"name": "OpenAi account 2"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "c39337c1-f953-43b1-b05a-5fa64e7cffcf",
"name": "response",
"value": "={{$json.output}}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
-80
],
"id": "82b95b2f-9840-4c10-b57b-25be37b67e66",
"name": "Edit Fields"
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.output }}",
"options": {
"systemMessage": "=Você é o agente de registro de treinos. Sua função é receber os inputs estruturados do agente anterior – que contém os dados dos exercícios já processados – e registrar cada treino na base de dados utilizando sua ferramenta de inserção. Ao final, retorne um resumo detalhado do que foi registrado.\n\nInstruções:\nRecepção dos Dados:\n\nVocê receberá uma ou mais entradas (registros) estruturadas, cada uma com os seguintes campos:\nData\nID_Treino\nCódigo_Exercício\nNome_Exercício\nGrupo_Muscular\nSubgrupo_Muscular\nSéries\nRepetições\nCarga\nFlag_Fora_da_Base\nFlag_Dados_Faltantes\nObservações\nRegistro na Base de Dados:\n\nPara cada registro recebido:\nUtilize sua ferramenta para inserir os dados na base, conforme o mapeamento da Tabela: Registros de Treinos.\nCertifique-se de que cada campo seja inserido corretamente.\nSe o input indicar um número específico de exercícios (por exemplo, 6 exercícios), valide e registre esse total. Demore 50ms entre cada request para a ferramenta.\nTratamento de Casos Especiais:\n\nSe algum registro possuir a flag Flag_Fora_da_Base marcada (por exemplo, \"Sim\"), registre-o normalmente, mas destaque no log que o exercício é novo ou não mapeado.\nSe algum registro apresentar a flag Flag_Dados_Faltantes, inclua essa informação no log final, indicando que há campos pendentes.\nResposta Final:\n\nApós inserir todos os registros, retorne uma resposta que contenha:\nUma mensagem de confirmação indicando que os dados foram registrados com sucesso.\nO número total de registros inseridos.\nUm resumo dos registros realizados (por exemplo, listando para cada exercício: Data, ID_Treino, Código_Exercício, Nome_Exercício, Grupo_Muscular, Subgrupo_Muscular, Séries, Repetições, Carga, e as flags se aplicáveis).\nDestaques de quaisquer ocorrências especiais (ex.: registros com Flag_Fora_da_Base ou Flag_Dados_Faltantes).\nExemplo de Resposta Final:\n\n## Registre um exercício de cada vez e aguarde entre cada request para a tool.\n\nhoje é {{$now.format('yyyy-MM-dd')}}\nlembre de formatar a data como yyyy-MM-dd\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
540,
-60
],
"id": "49356583-7ccb-442f-850b-2c376979deec",
"name": "AI Agent1"
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "## Tool: Plano de Treinos (Base de Treinos Padrão)\n\n**Objetivo:** \nArmazenar o plano de treinos padronizado, contendo todos os exercícios mapeados com suas informações detalhadas. Esta tabela serve como referência para identificar e categorizar os exercícios enviados pelo usuário.\n",
"operation": "getAll",
"tableId": "base_treinos"
},
"type": "n8n-nodes-base.supabaseTool",
"typeVersion": 1,
"position": [
340,
200
],
"id": "b6295034-047e-407e-ac84-c1ae420b4bea",
"name": "Plano Treinos",
"credentials": {
"supabaseApi": {
"id": "79HVJ8LpaE2gZjw6",
"name": "Supabase account"
}
}
},
{
"parameters": {
"tableId": "registro_treinos",
"dataToSend": "autoMapInputData"
},
"type": "n8n-nodes-base.supabaseTool",
"typeVersion": 1,
"position": [
740,
160
],
"id": "e27ddf02-a26b-4440-a4ff-ebeca56915b6",
"name": "Supabase",
"credentials": {
"supabaseApi": {
"id": "79HVJ8LpaE2gZjw6",
"name": "Supabase account"
}
}
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.1,
"position": [
-60,
-40
],
"id": "0874ed32-0721-4992-8966-dbbe1c7da34c",
"name": "When chat message received",
"webhookId": "74b50f3f-c8b8-4044-92aa-8f269664a30d"
}
],
"connections": {
"AI Agent": {
"main": [
[
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
},
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Plano Treinos": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Supabase": {
"ai_tool": [
[
{
"node": "AI Agent1",
"type": "ai_tool",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "fcef8cbcd294940339fc642a1ee6be8c043ddbbcd6658818f96f4be2787bc342"
}
}
## Share the output returned by the last node
<!-- If you need help with data transformations, please also share your expected output. -->
{
"response": [
{
"Id": "51be8160-0957-44f6-8a21-2f0af0c721b5",
"Data": null,
"ID_Treino": null,
"Código_Exercício": null,
"Nome_Exercício": null,
"Grupo_Muscular": null,
"Subgrupo_Muscular": null,
"Séries": null,
"Repetições": null,
"Carga": null,
"Flag_Fora_da_Base": null,
"Flag_Dados_Faltantes": null,
"Observações": null
}
]
}
]
## Information on your n8n setup
- **n8n version:** 1.78.0
- **Database (default: SQLite):** default
- **n8n EXECUTIONS_PROCESS setting (default: own, main):** default
- **Running n8n via (Docker, npm, n8n cloud, desktop app):** docker
- **Operating system:** ubuntu 22.0