Cómo dar memoria persistente a tu agente de n8n con Postgres paso a paso
Aprende a conectar el sub-nodo Postgres Chat Memory al AI Agent de n8n para que tu chatbot empresarial recuerde el historial completo entre sesiones distintas, sin escribir una línea de código y en menos de 45 minutos.
Cognitiva, agencia chilena de IA, trabaja con agentes de n8n a diario, y el problema que más frustra a las empresas es siempre el mismo: el chatbot olvida todo cada vez que se reinicia el workflow. La solución nativa existe desde n8n 1.82: el sub-nodo Postgres Chat Memory conectado al nodo AI Agent. Con esta configuración el agente guarda cada turno de conversación en una tabla de tu base de datos Postgres —puede ser Supabase en su plan gratuito— y los recupera automáticamente en la próxima sesión identificada por el mismo ID. El resultado es un chatbot empresarial que recuerda al usuario aunque cierres el navegador, reinicies el servidor o pasen días entre mensajes. Este tutorial te lleva desde cero hasta tener el agente operativo en aproximadamente 45 minutos, sin escribir código y usando n8n self-hosted —que es gratuito— junto a cualquier LLM: Claude o GPT-4o.
Por qué el AI Agent de n8n olvida todo (y cómo resolverlo)
Cuando construyes un agente de IA con n8n, el nodo AI Agent procesa el mensaje del usuario, llama al LLM y devuelve la respuesta. Sin embargo, cada ejecución del workflow es independiente: el agente no tiene noción de lo que dijo en ejecuciones anteriores. Esto equivale a contratar a un ejecutivo que pierde la memoria al salir de la sala de reuniones.
N8n ofrece varios tipos de memoria para su AI Agent. La más sencilla —Window Buffer Memory— guarda los últimos N mensajes en RAM, dentro de la misma sesión de chat. Si el usuario cierra el navegador, recarga la página o el workflow se reinicia por cualquier motivo, ese contexto desaparece.
La alternativa robusta es el sub-nodo Postgres Chat Memory. En lugar de guardar los mensajes en memoria volátil, los escribe en una tabla de tu base de datos Postgres cada vez que el usuario envía o recibe un mensaje. La próxima vez que ese mismo usuario (identificado por su session ID) inicie una conversación, el agente recupera el historial desde la base de datos y actúa como si la conversación nunca se hubiera interrumpido.
Comparativa: Window Buffer Memory vs. Postgres Chat Memory
Antes de configurar cualquier cosa, conviene entender la diferencia entre las dos opciones más comunes de memoria en n8n para tomar la decisión correcta según el caso de uso.
| Característica | Window Buffer Memory | Postgres Chat Memory |
|---|---|---|
| Dónde vive | RAM / sesión activa | Base de datos Postgres |
| Sobrevive al reinicio | No | Sí |
| Sobrevive al cierre del navegador | No | Sí |
| Requiere base de datos | No | Sí (Supabase free tier basta) |
| Apta para producción multiusuario | No | Sí |
| Límite de historial | N mensajes en contexto | Configurable (tabla crece) |
| Costo adicional | Ninguno | Mínimo (Supabase gratis hasta 500 MB) |
La regla práctica es sencilla: si construyes un prototipo o un agente de uso personal en una sola sesión, Window Buffer Memory es suficiente. Si el agente atiende a más de un usuario, necesita recordar conversaciones pasadas o debe sobrevivir a reinicios del servidor, Postgres Chat Memory es la opción correcta.
Paso 1 — Preparar Postgres con Supabase
Supabase es una plataforma de base de datos como servicio construida sobre Postgres. Su plan gratuito incluye 500 MB de almacenamiento, lo que equivale a cientos de miles de mensajes de conversación almacenados. Es la forma más rápida de tener un Postgres listo sin instalar nada.
Crear el proyecto en Supabase
Accede a supabase.com y crea una cuenta gratuita si aún no tienes una. Una vez dentro, haz clic en 'New Project', ingresa un nombre para el proyecto (por ejemplo, 'agente-n8n'), elige la región más cercana a tus usuarios (São Paulo o us-east-1 para Chile) y define una contraseña segura para la base de datos. Guarda esa contraseña en algún gestor de credenciales porque la necesitarás en el paso siguiente.
Obtener las credenciales de conexión
Una vez que el proyecto esté listo (tarda entre 1 y 2 minutos), ve a Project Settings en la barra lateral izquierda, luego a Database, y después a la pestaña Connection String. Selecciona la opción Session Pooler y cambia la vista a Parameters. Anota estos valores: host (algo como db.xxxxxxxx.supabase.co), puerto, nombre de la base de datos (normalmente 'postgres'), usuario y contraseña.
No necesitas crear ninguna tabla manualmente. El sub-nodo Postgres Chat Memory genera la tabla n8n_chat_histories en tu primera ejecución del workflow, con las columnas id (entero autoincremental), session_id (varchar 255) y message (JSONB).
Paso 2 — Armar el workflow en n8n
Con las credenciales de Supabase a mano, abre tu instancia de n8n. Si usas n8n self-hosted, accede desde el navegador a tu URL local o al dominio donde lo tengas desplegado. Si usas n8n cloud, inicia sesión en app.n8n.io.
Nodo 1: Chat Trigger
Crea un nuevo workflow y agrega el nodo Chat Trigger (búscalo como 'On Chat Message'). Este nodo expone una interfaz de chat integrada y genera un session ID único por conversación. En la configuración del nodo, activa la opción Load Previous Session para que el trigger propague el session ID a los nodos siguientes.
Nodo 2: AI Agent
Conecta un nodo AI Agent al Chat Trigger. Dentro del nodo, haz clic en el selector de modelo (campo 'Model') y agrega las credenciales de tu proveedor LLM. Si usas Claude de Anthropic, selecciona 'Anthropic Chat Model' y pega tu API key. Si prefieres OpenAI, selecciona 'OpenAI Chat Model' y haz lo mismo. En el campo System Prompt puedes definir el comportamiento del agente, por ejemplo: 'Eres un asistente comercial de nuestra empresa. Responde en español de manera concisa y profesional.'
Sub-nodo: Postgres Chat Memory
Dentro del nodo AI Agent verás el panel de configuración de memoria. Haz clic en el botón '+' junto a 'Memory' y selecciona 'Postgres Chat Memory' en la lista. Aparecerá un formulario con tres campos principales:
- Credentials: crea nuevas credenciales Postgres e ingresa los datos de Supabase (host, puerto, base de datos, usuario y contraseña). Presiona Test para verificar la conexión antes de continuar.
- Session Key: usa la expresión ={{ $('Chat Trigger').item.json.sessionId }} para que cada sesión de chat tenga su propio historial aislado en la base de datos.
- Table Name: escribe n8n_chat_histories (el nombre que n8n usa por defecto y crea automáticamente).
- Context Window Length: define cuántos mensajes previos incluir en cada llamada al LLM. Un valor entre 10 y 20 es suficiente para la mayoría de casos de uso empresarial.
-- Estructura que n8n crea automáticamente en tu primera ejecución
CREATE TABLE IF NOT EXISTS public.n8n_chat_histories (
id integer NOT NULL DEFAULT nextval('n8n_chat_histories_id_seq'::regclass),
session_id character varying(255) NOT NULL,
message jsonb NOT NULL,
CONSTRAINT n8n_chat_histories_pkey PRIMARY KEY (id)
);
-- Cada fila almacena un turno de conversación:
-- session_id: identifica la conversacion del usuario
-- message: objeto JSON con role (human|ai) y content (texto del mensaje)Una vez configurados los tres campos, guarda el sub-nodo y vuelve al canvas principal.
Paso 3 — Activar el workflow y probar la persistencia
Con el workflow armado, llega el momento de verificar que la memoria realmente persiste entre sesiones distintas. Este paso es el más importante: muchos tutoriales dan por válido el resultado sin probar el escenario de reinicio.
Primera conversación
Activa el workflow con el switch Active (esquina superior derecha). Luego abre el chat integrado haciendo clic en el botón 'Chat' que aparece en el nodo Chat Trigger. Envía un mensaje de presentación: 'Hola, me llamo Gonzalo y trabajo en el área de compras de mi empresa.' El agente debería responder normalmente.
Simular el reinicio
Cierra la ventana del chat. Espera al menos 10 segundos. Luego abre de nuevo el chat desde el mismo nodo, pero asegúrate de que el session ID sea el mismo que en la sesión anterior (el Chat Trigger lo mantiene si accedes desde la misma pestaña del navegador). Escribe: '¿Recuerdas cómo me llamo?' Si el agente responde 'Gonzalo', la memoria persistente funciona.
Verificar en Supabase
Abre el Table Editor en Supabase y busca la tabla n8n_chat_histories. Deberías ver todas las filas generadas por la conversación: una por cada mensaje del usuario y una por cada respuesta del agente. El campo message muestra el objeto JSONB con role y content.
Checklist de validación Cognitiva para agentes con memoria
En Cognitiva hemos diseñado un checklist de 8 puntos para validar que un agente de n8n con Postgres Chat Memory está listo para producción. Úsalo antes de presentar el agente a usuarios reales.
- La tabla n8n_chat_histories existe en Supabase y tiene al menos una fila tras la prueba inicial.
- El campo session_id tiene guión bajo (no espacio ni camelCase); la tabla fallaría en silencio de otro modo.
- El Context Window Length está definido (no en blanco); un valor en blanco incluye todo el historial y puede exceder el contexto del LLM.
- Cada usuario del sistema tiene su propio session ID único; no se comparte historial entre usuarios distintos.
- El workflow tiene gestión de errores: si Postgres no responde, el agente debe informar al usuario en lugar de quedar silencioso.
- La contraseña de Supabase está almacenada en las credenciales de n8n, nunca en el cuerpo de un nodo o en texto plano.
- Se verificó el comportamiento tras reinicio: cerrar el chat y volver con el mismo session ID recupera el historial.
- Se definió una política de retención: para conversaciones de más de 90 días, evalúa archivar o resumir el historial para mantener el rendimiento.
Un agente que olvida a sus usuarios no es un agente: es un formulario con respuestas generativas. La diferencia real está en que recuerde.
Si los 8 puntos están verificados, el agente está listo para recibir usuarios reales. Si alguno falla, corrígelo antes de activar el workflow en producción.
Errores frecuentes y cómo resolverlos
Estos son los problemas más comunes al configurar Postgres Chat Memory en n8n, con su solución directa.
Error: ECONNREFUSED al conectar a Supabase
Este error indica que n8n no puede alcanzar el host de Postgres. Verifica que estás usando el host del Session Pooler y no el Direct Connection (que requiere SSL en configuración adicional). También confirma que el puerto sea el correcto: Supabase Session Pooler usa el 6543 en su plan gratuito, no el 5432 estándar.
El agente no recuerda nada tras reiniciar
La causa más común es que el session ID cambia entre sesiones. Si accedes al chat desde una pestaña nueva del navegador, el Chat Trigger genera un nuevo session ID. Verifica en Supabase si hay dos session IDs distintos en la tabla. Para evitarlo en producción, pasa el session ID del usuario desde tu sistema externo vía el cuerpo de la solicitud HTTP.
La tabla no se creó automáticamente
Esto ocurre si la primera ejecución del workflow falló antes de llegar al sub-nodo de memoria. Activa el workflow, abre el chat y envía al menos un mensaje exitoso. Si el problema persiste, verifica que las credenciales de Postgres tengan permisos de creación de tablas en el esquema público.
El agente incluye demasiado historial y el LLM responde lento
Reduce el valor de Context Window Length. Con 10 a 15 turnos previos se mantiene el contexto conversacional en la mayoría de los casos empresariales sin sobrecargar el prompt. Si las conversaciones son muy largas, considera implementar resúmenes periódicos del historial con un nodo adicional que condense los turnos más antiguos.
Configurar memoria persistente en n8n con Postgres Chat Memory
Conecta el sub-nodo Postgres Chat Memory al nodo AI Agent de n8n para que tu chatbot empresarial retenga el historial completo de conversación entre sesiones distintas, sin escribir código.
Fase 1 – Preparar la base de datos Postgres
Fase 2 – Armar el workflow en n8n
Fase 3 – Verificar la persistencia
Preguntas frecuentes
Da el siguiente paso
Hablemos
Cuéntanos sobre tu negocio. Respondemos en 24 horas.
Otros canales
Escríbenos por WhatsApp o agenda una llamada de 30 minutos.