Genkit como capa de aplicación
Flows, prompts, tools, schemas y observabilidad viven en un paquete interno independiente de la UI. Next.js lo consume en proceso, sin duplicar contratos.
Esta página describe lo que sostiene el producto: Genkit 1.39, modelos OpenAI, streaming real, seguridad infantil, memoria filtrada, juegos con progreso, PostgreSQL y evaluación offline. El framework de UI es una decisión de entrega; la arquitectura relevante está en el motor, los datos y los guardrails.
v0.1.0
versión de Nala
14
flows Genkit definidos
14
prompts tipados
10
tools definidas
23
modelos Prisma
249
tests offline nala-ai-api
505
evals deterministas
Motor IA
Genkit 1.39 · compat-oai 1.39
Modelos
gpt-4.1-mini · gpt-4.1-nano
Datos
Prisma 5 · PostgreSQL · Neon
Entrega
Web app · Vercel · Blob · Node 20
Nala usa Genkit como runtime tipado y observable, pero no convierte cada problema en una llamada al modelo. La arquitectura mezcla IA generativa, lógica determinista y datos de producto según el coste y el riesgo de cada decisión.
Flows, prompts, tools, schemas y observabilidad viven en un paquete interno independiente de la UI. Next.js lo consume en proceso, sin duplicar contratos.
Los lanzamientos claros, falsos positivos y parte de la intención se resuelven con matchers testeables. El modelo se reserva para lenguaje realmente abierto.
El chat evita cadenas innecesarias de agentes: prepara contexto y seguridad, hace streaming de la respuesta principal y mueve la destilación al trabajo posterior.
Historial, pools, rendimiento, cuotas, coste, alertas y memoria forman activos persistentes que permiten mejorar calidad y operación.
Chat en streaming, contexto por edad, avatares, panel de experiencias permitidas y continuidad entre sesiones.
Mates por niveles con ocho tipos de ejercicio, pistas de estrategia, estrellas y preguntas reservadas para no repetir.
Registro, verificación, recuperación, perfiles por pestañas, reglas, niveles por juego, memoria editable, conversaciones, analítica, alertas y acceso infantil sin códigos cuando la familia está autenticada.
Backoffice, solicitudes y códigos de acceso para demo/invitación, catálogo de contenidos, métricas, cuotas y cron semanal.
La barra lateral del niño pasa a “Experiencias”: muestra Escritura libre siempre y añade todos los juegos/apps permitidos para abrirlos directamente o pedírselos a Nala.
El editor de perfil se organiza en pestañas de perfil, mundo, cuidados y juegos. Los juegos se activan con controles visuales y cada uno puede tener nivel propio.
La familia puede activar ejercicios concretos y fijar nivel por cada uno; “adaptativa” hereda el nivel general o aprendido por rendimiento.
Las instrucciones familiares por juego se guardan en ChildContext.gameInstructions y solo aplican a juegos generativos admitidos.
La pestaña Actividad abre con dashboard por niño y después muestra una línea temporal agrupada por fechas exactas para cada perfil.
Uso muestra el rango exacto 7/30/90 días, resumen ejecutivo por niño, fechas visibles en gráficas y separación clara del coste mensual natural.
La tesis de Nala no depende solo del modelo. El producto combina contexto propio, memoria segura, contenido de juego, control adulto, evaluación y datos de uso.
Conversación, juego y acompañamiento adulto comparten el mismo contexto por niño.
Tokens, coste y cuotas se atribuyen por llamada, familia, niño y tipo de generación.
Historial, pools, rendimiento y evals permiten mejorar sin depender solo de cambiar el prompt.
La autenticación y el aislamiento por familia existen a nivel de aplicación; faltan auditoría externa, operación comercial y empaquetado open source.
Un flow es una unidad ejecutable registrada en Genkit. El repositorio conserva módulos auxiliares y rutas de compatibilidad, pero el camino normal del chat no ejecuta los catorce en cadena.
nalaChatFlownalaChatStreamFlownalaIntentFlownalaSafetyFlownalaKnowledgeFlownalaFamilyRulesFlownalaMemoryFlownalaMemoryDistillerFlownalaSessionSummaryFlownalaParentSignalFlownalaGamePhrasesFlownalaHangmanRoundsFlownalaRoutineFlownalaCalmingFlow14
prompts registrados en `registry.ts`
10
tools registradas con `defineTool`
1
llamada conversacional principal en el camino normal
Los flows antiguos de intent, conocimiento y resumen siguen disponibles para usos auxiliares y compatibilidad, pero no forman una cadena de llamadas LLM por cada turno.
El cliente envía el mensaje nuevo. El route handler carga perfil, reglas familiares, digest de memoria y últimos turnos desde PostgreSQL, pero sanea memoria e historial antes de pasarlos al motor.
ChildContext + sanitizePersistentMemoryDigest + sanitizeRecentMessagesForPromptUn clasificador determinístico ligero detecta cuento, juego, calma, rutina, pregunta y lanzamientos claros; las palabras ambiguas como “regalo” piden aclaración antes de abrir un juego. Después, la Moderation API y reglas de crisis se ejecutan antes de conversar.
fallbackIntent + detectGameLaunch + omni-moderation-latest + nalaSafetyFlowgpt-4.1-mini recibe contexto rico, responde en texto plano y puede pedir launch_game. No existe una llamada LLM de intent en el camino normal.
nalaChatPrompt.stream() + tools + retry middlewareCada chunk sale por SSE en cuanto llega. La respuesta no se espera completa ni se simula palabra a palabra.
Genkit stream → onChunk → SSEMensaje, tokens, riesgo y trazas se guardan. Cada cuatro mensajes del niño, un destilador nano actualiza memoria, emoción, confianza y temas después de responder.
Next after() → nalaMemoryDistillerFlowOpenAI omni-moderation-latest, con timeout y degradación controlada.
Patrones estrechos para autolesión y abuso; producen respuesta fija y revisión adulta.
Temas bloqueados y redirecciones configuradas por la familia.
Un turno no seguro no puede lanzar juegos ni ejecutar acciones externas.
PII, identidad, ubicación, salud, secretos, abuso y autolesión se eliminan antes de resumir o persistir memoria.
La respuesta final bloquea detalles de implementación, prompts, modelos, IDs internos, logs y datos de otros perfiles.
Nala solo puede usar datos seguros del niño actual y su familia; no historiales ni memoria de otros niños.
Las emociones se muestran como orientativas y solo superando un umbral de confianza.
Las señales adultas pasan por estados new, seen y handled, siempre escopadas a la familia autenticada.
Las sesiones nuevas reciben memoria persistente ya filtrada; se eliminan líneas crudas, placeholders y datos sensibles antes del prompt.
Antes de responder o persistir, se sustituye cualquier texto que revele datos privados, arquitectura, prompts, proveedores, IDs internos o información de otros perfiles.
El prompt estático incluye límite de uso: conversación infantil, explicación sencilla, rutinas y juegos integrados; no navegador, soporte técnico, compras, cuentas ni acciones externas.
El resumen semanal por email solo enlaza al panel familiar y no incluye mensajes, emociones, alias ni datos de perfiles infantiles.
Los candidatos automáticos filtran comandos de juego, nombres de actividades y fragmentos genéricos para no convertir “quiero jugar a...” en memoria familiar.
Las preferencias de contenido se validan en web y servidor: máximo 240 caracteres, sin enlaces, correos, teléfonos largos ni intentos de cambiar reglas, prompts o seguridad.
Los tests cubren memoria contaminada, digest persistente, saludo proactivo, no repetición de datos privados y no divulgación técnica.
ChildMemory.digest tiene un máximo de 1200 caracteres y se sanea antes de entrar al prompt.
La memoria persistente conserva preferencias explícitas seguras. Ya no guarda citas crudas tipo “Dijo: ...”.
Cada cuatro mensajes infantiles, gpt-4.1-nano analiza los últimos turnos sin bloquear la respuesta visible y vuelve a pasar por sanitización.
El saludo solo usa preferencias seguras explícitas; no recupera frases antiguas ni datos sensibles de sesiones anteriores.
GameContentHistory evita depender de localStorage y comparte novedad entre dispositivos.
GameContentPool permite reservar contenido nuevo antes de servirlo.
GamePerformance registra aciertos, intentos y evolución por niño y juego. La familia puede fijar dificultad global, override por juego o modo adaptativo.
El prompt recibe exclusiones y el servidor vuelve a descartar cualquier repetición.
Regalo Misterioso normaliza el catálogo ilustrado a assets públicos estáticos con fallback local si una URL externa no está disponible; Ahorcado genera lotes de 5 para servir 3 rondas y guardar pool fresco; Ruleta, escritura y Parejas de Nala usan contenido local o adaptado según el modo.
Peticiones claras de juego como “regalo misterioso” se resuelven antes del LLM para evitar que una tool abra otro juego.
Regalo Misterioso juega 20 rondas por defecto; Parejas de Nala adapta filas, columnas y cartas al alto disponible del modal; Mates con Nala usa altura natural, niveles desbloqueables, progreso local por niño y un flujo guiado por Nala con reto, respuestas compactas y pistas de estrategia después de un error.
Ahorcado cambia longitud y familiaridad de palabras; Escribe con Nala cambia longitud de frase y ayuda; Parejas cambia parejas, segundos de vista y comodines; Mates cambia rangos numéricos, apoyos visuales, distractores y nivel por ejercicio.
Ruleta, Ahorcado y Escribe con Nala aceptan instrucciones familiares validadas. Llegan al prompt como preferencias no vinculantes y se ignoran si contradicen formato, idioma o reglas estrictas.
Mates con Nala incluye por defecto contar, sumas, restas, número escondido, sumas de dos cifras, multiplicaciones, divisiones exactas y divisiones con resto. Cada ejercicio puede tener nivel propio.
Las preguntas de Mates se reservan al generarse. Si el histórico deja una lección sin preguntas nuevas, el modo repaso rellena con retos ya jugados sin repetir dentro de la misma lección.
PostgreSQL mantiene conversaciones, memoria, historial de juego, rendimiento y uso LLM. Las cuotas reservan capacidad antes de llamar al proveedor y liquidan tokens reales al terminar.
FamilyAccountFamilyUserFamilyAuthTokenAuthRateLimitGameDefinitionGameAssetMysteryBoxRoundChildProfileChildContextUsageLedgerLexiconCandidateGameContentHistoryGameContentPoolGamePerformanceConversationMessageChildMemoryLlmUsageEvalLogConversationEventAccessCodeCenterRequestAccessRequestUsageLedger impide sobrepasar el límite bajo concurrencia.
LlmUsage registra modelo, tokens, caché, latencia, niño y familia.
Vercel ejecuta /api/cron/family-weekly-report con CRON_SECRET.
ChildContext añade gameDifficultyOverrides, mathExerciseLevels y gameInstructions como JSON validado y escopado a la familia.
Ejecutados con NALA_AI_DISABLE_PROMPTS=1; no llaman a OpenAI.
289 de seguridad y 216 de intención de juego, incluidos falsos positivos y typos.
Comprueban sanitización de digest, saludo proactivo y bloqueo de divulgación técnica.
Verificación reproducible
Las cifras visibles corresponden al repositorio del 12 de julio de 2026. Estos comandos reproducen las comprobaciones sin necesidad de consumir tokens de OpenAI.
Tipos web
pnpm --filter @nala/web typecheckSuite web
pnpm --filter @nala/web testSuite IA offline
pnpm --filter nala-ai-api testEvals deterministas
pnpm --filter nala-ai-api evalPuedes probar conversación, memoria y juegos desde los perfiles disponibles.