Saltar al contenido principal
2026-09-10Registro de desarrolloAgente de IAArquitectura

Desmontando un Agente funcional: El mes de PureLab cambiando de motor

En julio terminamos la primera generación del asistente en el proceso del producto. En agosto, para comparar resultados, mantuvimos el motor antiguo y escribimos más de treinta decisiones rígidas en el diseño, solo para desecharlo todo. Durante el mes siguiente, no hicimos compatibilidad con la ruta antigua ni migramos el historial, separando el diálogo del proceso del producto.

Desmontando un Agente funcional: El mes de PureLab cambiando de motor

En el informe mensual de agosto escribimos una frase: la versión del asistente no se abrirá por ahora.

No fue por pereza. En ese momento, la primera generación de Agent ya podía dialogar, buscar pistas y generar vistas previas en la página de organización; lo que realmente estaba bloqueado era la base. Seguir apilando funciones encima equivalía a soldar la orquestación, las sesiones, las claves y la música en el mismo proceso. En el segundo producto tendríamos que volver a hacerlo todo. Elegimos desmontar lo que funcionaba y cambiar a un entorno de ejecución que se pudiera incrustar, auditar y aislar de fallos.

Este cambio fue mucho más difícil que escribir una caja de chat desde cero.

🛠 La primera generación ya funcionaba, y ese era el comienzo de los problemas

Lo de julio no era un prototipo. Era un asistente completo incrustado en el proceso de PureLab: flujo continuo en múltiples rondas, almacenamiento de sesiones en base de datos, cancelación y bloqueo en serie, claves de modelo proporcionadas por el usuario, búsqueda en la biblioteca y vista previa de etiquetas, y la escritura seguía pasando por la puerta de confirmación del propio producto. La seguridad del dominio era un punto fuerte: el modelo no podía modificar archivos directamente, las rutas debían anonimizarse y el control de acceso a los planes no podía eludirse por pasar por el diálogo.

El problema no era “si se podía hablar”, el problema era la forma.

La orquestación, el canal de eventos, la tabla de sesiones, el descifrado de claves y la invocación de herramientas estaban todos en el proceso del producto. La interfaz solo reconocía este único flujo de eventos. Si se cambiaba la biblioteca, se cambiaba la barra o colisionaban las generaciones, la máquina de estados tendría que escribirse de nuevo tanto en el frontend como en el backend. Lo que era aún más problemático: si el próximo producto de escritorio también necesitaba un asistente, equivalía a replicar otro Host. Eso no es incrustar, es que cada App crie su propio Agent.

No es que no hubiéramos intentado “mantener lo viejo y conectar un conjunto nuevo”.

🚧 Un desvío aún más difícil: Mantener dos motores para comparar resultados, redactar cuatro mil líneas de diseño y luego desecharlo todo

A principios de agosto hubo un camino que parecía más seguro: colgar en la barra lateral derecha tanto la “IA Clásica” como el “Asistente Inteligente”. Al principio, conservar el núcleo antiguo era solo para tener una línea base para “comparar resultados” al conectar la nueva base. Esperábamos que, mientras el nuevo proceso aislado completaba lentamente la compatibilidad con Windows, el empaquetado y el canal de claves, pudiéramos verificar la calidad de la salida del modelo a través del motor antiguo.

Sobre el papel, esto se llama una transición suave, pero después de escribirlo en el diseño, se convirtió en un desastre.

Para mantener esta “comparación”, los comandos de diálogo de los dos conjuntos no podían mezclarse, las sesiones de ambos no podían conciliarse, y la misma clave debía alimentarse simultáneamente a la orquestación dentro del proceso y al proceso aislado. Lo peor era que las claves no podían escribirse en variables de entorno ni en archivos de configuración. Las vistas previas, confirmaciones, escrituras y reversiones debían seguir pasando por la cadena de seguridad del producto, mientras que el nuevo núcleo no podía tener permisos de archivos arbitrarios. Windows había cerrado explícitamente los procesos aislados en ese momento, el acceso aún debía existir, el texto debía ser legible por humanos, y no podía estar en blanco ni bloquearse.

Ese diseño de doble entrada hecho para “comparar resultados” apiló a la fuerza más de treinta decisiones rígidas y el texto superó las cuatro mil líneas. Incluso antes de empezar a implementarlo, sabíamos que: esto no era una comparación en absoluto, era criar dos asistentes, dos libros de cuentas y dos dominios de falla al mismo tiempo. Cualquier idea de “hacer compatible un poco las sesiones antiguas” bloquearía ambos lados.

El 13 de agosto, todo fue desechado.

El nuevo contrato solo tiene unas pocas frases, pero cada una es costosa: Kit escribe todo el código nuevo, comandos nuevos, canales de eventos nuevos. No se hace compatibilidad con la ruta antigua, no se concilian cuentas, no se migra el historial, no se comparten tablas. La “misión de comparación” del antiguo Agent terminó directamente. Al eliminarlo, solo borramos la entrada antigua del producto, sin alterar el nuevo contrato.

Esto significa que del lado del usuario no se verá “traer el historial de chat anterior”. No se olvidó, fue intencional. Migrar el historial antiguo al nuevo entorno de ejecución parece considerado, pero en realidad es atar los ciclos de vida de ambos conjuntos para siempre. No podíamos permitirnos pagar esos intereses.

⛰️ Las montañas que había que mover simultáneamente para cambiar el motor

Desecharlo fue solo un permiso. Lo realmente laborioso fue dividir la “función de chat dentro del producto” en tres capas y conectarlas a PureLab en un mes.

  • 📦 La primera montaña es el proceso: El bucle del modelo ya no podía competir con la página de organización, la escritura y el análisis por el mismo dominio de fallos. El diálogo se ejecuta en un proceso aislado; el producto solo se encarga de iniciar, supervisar y recuperar en caso de fallo. Si el proceso aislado colapsa, la biblioteca musical y la canalización de etiquetas aún deben estar ahí. A la inversa, el producto tampoco debe proporcionar un terminal de propósito general, un sistema de archivos arbitrario o herramientas externas al modelo; el permiso de escritura de la biblioteca musical no pertenece al asistente.
  • 🔌 La segunda montaña es el protocolo: A la interfaz no se le permite hablar del protocolo de sesión subyacente, y al producto tampoco se le permite escribir manualmente un ciclo de “enviar prompt, escuchar eventos, ensamblar el historial” en su contenedor. Debe haber un protocolo de producto estable en el medio: enviar, detener, listar sesiones, restaurar, configurar el canal. El transporte puede ser mediante comandos de escritorio, el protocolo en sí no pertenece a una App en particular. Lo que debe hacer el segundo producto es colgar el panel, otorgar la identidad de la biblioteca musical actual, registrar capacidades de dominio, en lugar de implementar el Host de nuevo.
  • 🔑 La tercera montaña es la clave: La clave del modelo de los usuarios sigue sellada en el producto. Esta clave no puede aparecer en el disco ni en las variables de entorno del proceso aislado. La solicitud vuelve al loopback local desde el proceso aislado, es desencapsulada brevemente por el proceso del producto, transferida a la interfaz completada por el usuario, y luego se desecha. Copiar el archivo de la base de datos aún podría recuperar el texto cifrado, esto es un riesgo conocido; no fingimos que ya se ha resuelto usando el llavero del sistema.
  • 🛠 La cuarta montaña son las herramientas de dominio: El asistente puede buscar en la biblioteca autorizada actual, leer pistas, previsualizar renombramientos y parches de etiquetas, y también puede generar borradores. Pero no puede iniciar la escritura, no puede iniciar el renombramiento, no puede iniciar la canalización ni realizar análisis. El flujo de negocio debe ser: primero previsualizar de 1 a 5 pistas; si la muestra es correcta, generar un máximo de 50 borradores; la mesa de trabajo abrirá el cuadro de escritura, y los archivos solo se modificarán cuando hagas clic en Aplicar. Al modelo no se le permite inventar rutas, no se le permite pedirte que proporciones IDs internos de la biblioteca, y mucho menos afirmar que “ya ha modificado los archivos”.
  • 🚀 La quinta montaña es el empaquetado multiplataforma: Para el mismo conjunto de contratos, macOS tiene que pasar la firma de sandbox, mientras que Windows estuvo inoperativo en un momento, solo mostrando “no disponible en el sistema actual”. No fue hasta septiembre que Windows alineó el directorio de inicio del proceso aislado, los interruptores de capacidad y los directorios de depuración/lanzamiento. Para el Agent de software de escritorio, la mitad del trabajo no está en el diálogo, sino en “poder instalarlo, poder iniciarlo, y que no colapse el programa principal”.

Estas cinco montañas debían moverse juntas. Si primero hacíamos el chat y luego añadíamos la seguridad, o si primero hacíamos la seguridad y luego añadíamos Windows, arrastraríamos de vuelta la entrada antigua durante el período de control. También eliminamos el derecho a traer de vuelta la entrada antigua.

⚙️ En qué se gastó realmente este mes

Desde mediados de agosto hasta el 10 de septiembre, en el calendario aparece “integración”. Pero los días estuvieron llenos de tratamientos de bordes preocupantes:

  • El enredo del canal y la máquina de estados: En la configuración debía haber una entrada de “Asistente de IA” que los humanos pudieran encontrar. Cuando no hay configuración, el panel no puede dibujarse como si ya estuviera listo; la barra de diálogo está vacía en inglés de forma predeterminada, y el producto inyecta un “ir a configuración”, llevando a la persona a la página de ajustes; los códigos de error internos tampoco pueden arrojarse a la interfaz al azar. Al cambiar la dirección de la interfaz, en un momento se obligó a enviar la clave de nuevo; solo más tarde se permitió “la clave sigue ahí, solo se cambia la dirección o el modelo”, algo que haría una persona real. Estos no son problemas de texto; es que la máquina de estados del canal y el descifrado de claves se ataron juntos.
  • La gestión de sesiones más difícil que el cuadro de chat: Crear una nueva sesión no puede ser sobrescrito por “restaurar la última no vacía”. Al cambiar a otra biblioteca musical, la lista de sesiones debe cambiar en consecuencia, sin cruzarse; al cerrar la barra lateral derecha y volver a abrirla, en la misma ejecución debería haber una pantalla de relleno, en lugar de reproducir el diálogo como una máquina de escribir; solo se hace una recuperación en frío al cerrar y volver a abrir el software. Al salir y volver a entrar, incluso se perdió el historial; luego se cambió para recordar los eventos ya proyectados por sesión. Eliminar una sesión debe cerrar simultáneamente la sesión subyacente y borrar el directorio del disco, y no puede permitir clics accidentales durante la generación.
  • El mecanismo de escritura extremadamente desgastante: La puerta de confirmación del antiguo Agent era correcta, y la nueva base no podía volverse laxa por cambiar de transporte. En el chat ya no se pregunta “¿Permitir esta herramienta?”: las consultas aprobadas son dejadas pasar por el host. A principios de septiembre se agruparon finalmente los eventos del producto de “rellenar parámetros → previsualización de pequeña muestra → generar borrador → clic en Aplicar”; la confirmación para modificar archivos sigue estando en el cuadro de escritura, no en una ventana emergente del chat. El renombrado no tiene parche, solo puede mostrar primero una comparación de rutas; la aplicas después de verificarla en el área de operaciones. Cualquier oración de “el asistente ya ha modificado el archivo por ti” es un error (bug) en este conjunto de contratos.
  • La independencia del panel y el compromiso de integración: El panel mismo también debe parecer una mesa de trabajo, no una demostración. Markdown solo hace títulos y listas, no tiene resaltado de código; la salida de flujo, los fallos y las cancelaciones siguen el mismo conjunto de renderizado. El interior del panel está codificado de forma rígida en inglés; el producto solo puede cambiar la frase de entrada a la configuración: este es uno de los costos de la integración en tres repositorios. Está incrustado en el lado derecho de la página de organización; recientemente se ha hundido hasta el fondo, para no competir por la misma línea de visión con la extracción, el reemplazo y la canalización.

Ninguna de estas cosas podía lanzarse por separado. Si se cambia el protocolo, el host, el panel y el adaptador del producto deben moverse en tres frentes. Si se omite uno, el resultado es que “a veces puedes charlar, a veces se pierde el historial, a veces la clave se envía al lugar equivocado”.

👀 Qué verás ahora en la mesa de trabajo

El producto se ha actualizado a la versión 6.0. En el extremo derecho de la página de organización, la entrada de IA está anclada en la parte inferior de la barra de actividad. Al abrirla, es una mesa de trabajo de diálogo completa: admite múltiples sesiones, es recuperable y se puede detener en cualquier momento. Comparado con el informe mensual 5.0 de agosto, la entrada ya es permanente; el si la tienda ya ha distribuido esta versión, este artículo no lo marcará como publicado.

  • Configuración flexible: Primero ve a la configuración para ingresar tu propia interfaz, modelo y clave. No atamos el diálogo a una nube específica, ni usamos un modelo incorporado en secreto cuando no hay configuración.
  • Capacidades de dominio restringidas: Después de configurarlo, puedes hablarle a la biblioteca musical abierta actual. Por ejemplo, previsualizar el renombrado por artista y álbum, o ver primero un pequeño lote de borradores de etiquetas. El asistente puede consultar, previsualizar y generar borradores; el si los archivos se modificarán sigue dependiendo de tu decisión en el cuadro de escritura o en la comparación de renombrado. La canalización de etiquetas lanzada en agosto sigue ahí, el asistente no presionará “iniciar” por ti.
  • Límites mantenidos firmemente: En esta ronda, aún no le damos análisis, portadas, letras ni metadatos de autocompletado en red. No es que no lo hayamos pensado; los límites deben ser firmes primero, antes de hablar de hacer más.

💡 El costo que estamos dispuestos a pagar y las cuentas aún por saldar

Lo más caro de cambiar el motor no fue escribir el nuevo código, fue admitir que la primera generación ya funcionaba, que el doble motor mantenido para comparar resultados parecía muy estable, y aun así desecharlos con decisión. No migrar el historial es ser irresponsable con los diálogos antiguos; migrar el historial es ser irresponsable con el nuevo contrato. Elegimos lo segundo, y eliminamos limpiamente la entrada antigua del producto, evitando que las dos versiones del asistente se compararan para siempre.

Las cuentas aún no pagadas también deben aclararse. El cambio de canal a nuestro propio relevo, el reemplazo del texto cifrado de la base de datos por el llavero del sistema, y lograr que la forma de lanzamiento en Windows sea tan libre de preocupaciones como en macOS, todo esto aún está en camino. El asistente es ahora una prueba piloto en la mesa de trabajo, en absoluto un eslogan publicitario de “lanzamiento oficial del asistente inteligente”.

En agosto convertimos la organización de etiquetas en una canalización, porque el trabajo repetitivo no debería depender de cambiar de barras manualmente. Este mes, separamos el asistente del proceso del producto, porque los diálogos, las claves y la reescritura no deberían compartir el mismo dominio de fallos. Ambas líneas de acción hacen lo mismo: permitir que la estación de trabajo local de la biblioteca musical se atreva a automatizar, y al mismo tiempo se atreva a detenerse antes de modificar archivos.

Solo al cambiar la base, podemos empezar a hablar de que realmente te ayude a organizar.