Interfaz del agente EVA con la cara reactiva y el panel del sistema límbico

EVA es un prototipo de agente conversacional con un "sistema límbico computacional": una arquitectura en Python que envuelve a un LLM intercambiable (el "córtex") y le añade lo que un modelo de lenguaje no tiene de serie: estado emocional con dinámica temporal real, memoria con carga afectiva, motivación propia (drives), aprendizaje al "dormir" e iniciativa para escribir primero. El LLM solo genera lenguaje; todo lo que da continuidad a EVA vive fuera de los pesos, en código, y persiste entre sesiones en una base de datos SQLite local (eva_brain.db).

El problema que aborda es la naturaleza stateless y reactiva de los asistentes basados en LLM: olvidan entre sesiones, no tienen estado interno coherente y solo responden cuando se les habla. EVA reconstruye en cada turno un contexto propio (estado afectivo, recuerdos relevantes, modelo del interlocutor, intenciones abiertas, conciencia temporal) y lo inyecta en el system prompt del modelo, de modo que las respuestas reflejan una continuidad de identidad y de relación. La emoción no es teatro de prompt: es consecuencia calculada de los eventos mediante un motor de appraisal, y modula tanto la memoria como la conducta.

Es honestamente un prototipo de I+D, no un producto: corre en local, funciona con la suscripción Claude (Max/Pro) vía el Agent SDK con OAuth y sin API key —por defecto sobre el modelo claude-haiku-4-5 para contener el coste estimado, elevable a sonnet/opus desde la propia interfaz—, o en modo "eco" sin LLM para demos y tests offline. Las capacidades hacia afuera (salida a la web, escritura en disco) están desactivadas por defecto tras kill-switches. Su valor para un contexto B2B es de demostración de capacidad técnica: muestra cómo orquestar un LLM con memoria persistente, estado, herramientas (tool use vía MCP) y autonomía controlada, con barandillas de seguridad y trazabilidad auditable.

  1. Percibir y valorar el evento (appraisal) Cada turno entra como un Evento. Un motor de appraisal inspirado en los modelos OCC/Scherer (valoracion.py) lo evalúa en cinco dimensiones: novedad, congruencia con metas, agencia (quién lo causó: EVA, el usuario o el mundo), afrontamiento y aprobación (halago o reproche dirigido a EVA). Por defecto es heurístico y determinista (léxico positivo/negativo normalizado sin tildes, negaciones, detección de si el mensaje va dirigido a EVA), con un sesgo opcional congruente con el mood; alternativamente el propio LLM hace la valoración con --valoracion-llm.
  2. Sentir: generar emociones que decaen La valoración se traduce en impulsos emocionales discretos (orgullo, culpa, gratitud, frustración, decepción, curiosidad...) ubicados en el espacio dimensional PAD (placer, activación, dominancia). Cada impulso decae exponencialmente, exp(-t/tau), con una vida media efectiva de unos 15 minutos (afecto.py), y cada emoción deja además una pequeña huella directa en el mood.
  3. Integrar en tres capas temporales Las emociones (minutos) alimentan el mood, un integrador lento con constante de tiempo de unas 36 horas; y el mood, solo al dormir, deriva la personalidad (baseline) un 8% por consolidación, acotada para no irse a los extremos. Así un mal día tiñe horas y una temporada entera deja huella lenta y limitada.
  4. Recordar con sesgo emocional Se recuperan recuerdos de la memoria episódica (memoria.py) puntuando similitud + recencia + saliencia (carga emocional) + congruencia con el mood actual, con pesos configurables. La similitud es híbrida: embeddings semánticos locales mezclados con coseno léxico de bolsa de palabras. Recordar 're-graba' levemente el recuerdo hacia el estado presente (reconsolidación) y registra su último acceso.
  5. Responder con estado inyectado y herramientas Se construye el system prompt con identidad, estado afectivo, drives bajo presión, hilo de conversación reciente, documentos semánticos, biografía (días de vida, turnos, último sueño) y conciencia temporal, y se llama al córtex (cortex.py). Durante la respuesta el LLM puede invocar herramientas reales (recordar, memorizar, actualizar su identidad, introspección, agenda del hogar...) vía un servidor MCP in-process del Agent SDK, con auto-aprobación acotada a una lista blanca.
  6. Codificar y, al dormir, consolidar El turno se graba como episodio con su etiqueta PAD y su saliencia. Al dormir (manual desde la cara o el REPL, o sola en horas de silencio si hay algo que consolidar) una llamada al córtex produce lecciones, reescribe los documentos de identidad, escribe una entrada de diario, ancla enlaces causales a los episodios que la cambiaron, fija intenciones propias, deriva la personalidad, madura los setpoints de los drives y olvida selectivamente lo viejo y trivial (consolidacion.py).

Estado emocional persistente (modelo PAD de 3 capas)

Calcula y mantiene un estado afectivo real (emociones, mood y personalidad baseline) en el espacio placer-activación-dominancia, que evoluciona aunque nadie hable, decae con el tiempo y sobrevive al cierre del programa.

Motor de appraisal OCC/Scherer

Deriva emociones discretas de cada evento evaluando novedad, congruencia, agencia, afrontamiento y aprobación. Heurístico determinista por defecto, con un perfil léxico que puede aprenderse y un sesgo mood-congruente; valoración por LLM opcional.

Memoria episódica con recuperación híbrida

Graba cada interacción con su carga emocional y la recupera combinando embeddings semánticos, coseno léxico, recencia, saliencia y mood, todo en SQLite con vectores normalizados (float32) que se reindexan solos si cambia el proveedor.

Memoria semántica de identidad

Mantiene cuatro documentos persistentes (quién es jcode, sus proyectos, quién es EVA y el hogar/la familia) que se inyectan en cada prompt y que el sueño y las herramientas del LLM reescriben cuando aprende algo estable.

Drives y motivación intrínseca

Curiosidad, conexión, competencia y descanso son niveles homeostáticos que decaen solos y se satisfacen con eventos; su presión entra en el prompt como impulso de conducta, hay drives que se oponen (conexión/curiosidad/competencia frente a descanso) con coste de oportunidad, y los setpoints maduran lentamente al dormir.

Consolidación al dormir

Un proceso tipo sueño extrae lecciones, reescribe la identidad, redacta diario, ancla enlaces causales a los episodios que la transformaron, fija intenciones, agrupa episodios en conceptos, deriva personalidad y olvida selectivamente lo viejo de poca carga emocional (preservando lecciones, diario, vault y conceptos).

Agencia sobre su propia mente (tool use)

El LLM dispone de un servidor MCP in-process con dieciocho herramientas reales: buscar en su memoria, memorizar, reescribir su identidad, introspección de estado, ver y moldear su personalidad de forma acotada, fijar intereses, revisar su coherencia interna, mirar sus propias costuras arquitectónicas, agendarse despertares, buscar en la web y anotar en el vault (ambas gateadas), y una agenda del hogar (recordatorios, seguimientos, fechas, preferencias y ubicaciones de objetos).

Proactividad y agente de fondo

Como proceso residente, EVA avanza su estado entre turnos y, cuando un drive (o un interés monotrópico) cruza el umbral —con cooldowns, tope diario y horas de silencio—, escribe primero. Un agente de fondo persigue intenciones propias paso a paso sobre un scratchpad persistente en SQLite, con rumiación, prospección de futuros y recombinación de ideas, todo bajo topes de coste.

Cara expresiva paramétrica

Una interfaz web dibuja dos ojos en SVG cuya expresión es una proyección numérica del estado PAD del cerebro, interpolada por frame (parpadeo y micro-sacadas modulados por la activación) y actualizada por WebSocket; incluye chat, panel del sistema límbico en vivo, widget de memoria, panel 'Mente' (pensamientos, diario, intenciones, modelo del usuario) y modo sueño.

Canal WhatsApp y voz

Puede recibir mensajes por webhook (POST /api/whatsapp) y responder por WhatsApp en dos modos configurables: invocando un CLI de WhatsApp Web (wacli, mudslide...) sin shell, o por POST JSON a una pasarela HTTP autoalojada tipo WAHA/wuzapi. Habla con voz neuronal de Edge (edge-tts, es-ES-XimenaNeural) servida desde /api/tts, con degradado a la síntesis del navegador, y admite dictado por voz con la Web Speech API.

  • Python: Lenguaje de todo el cerebro: orquesta el loop afectivo-cognitivo y los módulos de afecto, valoración, memoria, embeddings, drives, consolidación, proactividad y el agente de fondo, sin frameworks pesados y con lógica pura testeable.
  • Claude Agent SDK (claude-agent-sdk): Es el 'córtex': genera el lenguaje de las respuestas usando la suscripción Claude (Max/Pro) vía OAuth, sin API key. En el camino de respuesta se aísla con tools=[], strict_mcp_config=True y setting_sources=[] para que solo produzca texto. Modelo por defecto claude-haiku-4-5 (elevable a sonnet/opus desde la UI) y un córtex de fondo barato para valoración, pensamiento y sueño.
  • MCP server in-process (create_sdk_mcp_server + @tool): Expone al LLM las dieciocho herramientas reales de EVA (memoria, identidad, introspección, personalidad, agenda del hogar, web y vault gateados) como un servidor MCP local, habilitando tool use controlado y auto-aprobado solo sobre la lista blanca durante la respuesta.
  • SQLite: Base de datos local (eva_brain.db) que persiste todo: estado afectivo, drives, personalidad, episodios de memoria con sus vectores, documentos semánticos, scratchpad del agente y metadatos. Es lo que hace que EVA siga existiendo entre sesiones.
  • fastembed (modelo ONNX multilingüe local): Genera los embeddings semánticos de la memoria (paraphrase-multilingual-MiniLM-L12-v2) en local, sin servicios externos ni GPU obligatoria, con troceado y mean-pooling para representar textos largos. Es la base de la búsqueda híbrida de recuerdos y del clustering de conceptos al dormir.
  • Feature hashing (fallback de embeddings): Cuando fastembed no está instalado, un hashing determinista (crc32) de tokens y trigramas de caracteres produce vectores siempre disponibles; el índice se reconstruye solo si cambia el proveedor. El clustering de conceptos solo se activa con fastembed, para no agrupar ruido.
  • Modelo PAD + appraisal OCC/Scherer: Marco psicológico que da estructura al afecto: las cinco dimensiones de appraisal producen emociones discretas ubicadas en el espacio placer-activación-dominancia, con decaimiento exponencial e integradores de distinta escala temporal.
  • aiohttp: Servidor web asíncrono del proceso residente: sirve la cara, expone la API REST (/api/estado, /api/mensaje, /api/whatsapp, /api/tts, /api/modelo...) y el WebSocket que transmite el estado afectivo en vivo, además de correr el bucle vital del cerebro.
  • SVG + JavaScript (cara): Motor de ojos paramétrico en el navegador: traduce el estado PAD recibido por WebSocket en parámetros de expresión (apertura, párpados, arco, mirada, tinte) interpolados por frame con requestAnimationFrame, manipulando paths SVG por atributos, sin una imagen por emoción.
  • edge-tts y Web Speech API: Voz de EVA con voces neuronales de Edge (es-ES-XimenaNeural, requiere internet) sintetizada en el servidor y servida como audio por /api/tts; degrada a la síntesis local del navegador si falla. La Web Speech API del navegador (Chrome/Edge) permite dictar por voz.
  • AST de Python (tareas): Evalúa expresiones aritméticas con una lista blanca de operadores para la tarea 'calculo', de forma segura y sin shell, dentro del loop de competencia donde el éxito o el fallo de una tarea genera emoción real.
  • subprocess / urllib (canales y red): Envío de WhatsApp por CLI local sin shell (lista de argumentos) o por POST JSON a pasarelas HTTP autoalojadas, y comprobaciones HTTP de la tarea 'http'. La salida a la web (gateada) reutiliza WebSearch/WebFetch del SDK en una sesión efímera y aislada.
  • Asistente conversacional con memoria de largo plazo para soporte o atención, que recuerda al cliente entre sesiones y mantiene un modelo persistente de sus proyectos y preferencias.
  • Demostrador técnico para clientes que evalúan integrar LLMs con memoria, estado y tool use, mostrando arquitectura, persistencia y barandillas de seguridad ejecutándose en local.
  • Asistente personal y del hogar que lleva recordatorios, fechas señaladas, ubicaciones de objetos y preferencias de la familia, y puede avisar proactivamente por WhatsApp o voz.
  • Base para agentes proactivos internos que hacen seguimiento de tareas sin fecha entre conversaciones y escriben primero cuando un drive o un interés cruza su umbral.
  • Laboratorio de I+D sobre afecto computacional y autonomía controlada, con kill-switches apagados por defecto, topes de coste estimado y trazabilidad auditable de cada acción del agente.
  • Integración de un copiloto en canales existentes (WhatsApp vía pasarela autoalojada, web) que conserva el estado de la relación y reduce la fricción de repetir contexto.
  • Orquestación de un LLM como componente intercambiable y aislado, separando la generación de lenguaje del estado, la memoria y la conducta del sistema.
  • Persistencia real de estado y memoria en SQLite con embeddings vectoriales, incluyendo recuperación híbrida (semántica + léxica) y degradado robusto a feature hashing sin dependencias.
  • Implementación de tool use mediante un servidor MCP in-process del Agent SDK, con lista blanca de herramientas y auto-aprobación controlada.
  • Diseño de seguridad por capas: kill-switches apagados por defecto, sandbox de escritura en el vault, sanitizador de privacidad fail-closed y política de dominios para la navegación, topes de coste, horas de silencio y transparencia auditable.
  • Modelado de dinámica temporal (decaimiento exponencial, integradores lentos, homeostasis con maduración) traducido a conducta del agente de forma determinista y testeable.
  • Arquitectura full-stack autocontenida: backend asíncrono con aiohttp, API REST y WebSocket en tiempo real, y un frontend de visualización paramétrica en SVG.

Captura de la interfaz; el núcleo de razonamiento se ejecuta en un backend propio.

De prototipo a producción

Si algo de esto encaja con un problema real de tu negocio, lo convertimos en una solución mantenible y con control total.

Hablemos de tu proyecto

Diagnóstico gratuito — Detecta dónde se pierden horas y qué automatización tiene más retorno

Pedir diagnóstico