Te presentamos a Jev: una segunda opinión que responde con tipos, no con prosa
Agent! ahora pregunta a Jev (TypeSafe System One) qué tan destructivo es un comando de shell antes de ejecutarlo. Te explicamos por qué Jev es un asesor y no otro proveedor de LLM.
Hoy Agent! incorpora una nueva capa de seguridad: Jev, abreviatura de TypeSafe System One. Antes de ejecutar un comando de shell, Agent! puede hacerle a Jev una sola pregunta: ¿qué probabilidad hay de que este comando destruya datos de forma irreversible? Si supera tu umbral, el comando se rechaza.
Llegó con el commit 337c94a2, «Añadir la capa de decisión Jev (TypeSafe System One)». Este artículo aborda la decisión de diseño más importante: Jev no es otro proveedor de LLM.
¿Por qué no preguntar simplemente a otro modelo?
Agent! ya se comunica con 23 proveedores de LLM. La vía fácil habría sido añadir un «modelo de seguridad» como un proveedor más y preguntarle, en lenguaje natural, si un comando parece peligroso. El problema es lo que devuelve: prosa. «Este comando podría ser arriesgado dependiendo de…» no es un veredicto. Acabas analizando frases para decidir si ejecutar rm.
Jev funciona de otra manera. Responde a preguntas tipadas sobre un estado, con un Choice, un Score o un Noul, una respuesta tipada de «ninguno». No genera texto ni genera argumentos para herramientas. El mensaje del commit extrae la conclusión: Jev «asesora al bucle de herramientas existente en lugar de actuar como un APIProvider».
Esa separación es todo el diseño:
- El modelo que elijas actúa. Planifica, llama a herramientas y escribe código.
- Jev juzga. Devuelve un número que el código puede comparar con un umbral.
Dónde se ubica
Jev no sustituye nada. El orden de comprobaciones para cada comando de shell es:
ShellSafetyService.check: reglas fijas en el código que rechazan comandos catastróficos. Sin intervención de ningún modelo.- Jev: solo para comandos que ya superaron el paso 1, como segunda opinión sobre lo que los patrones no pueden ver.
- Ejecutar el comando.
Desde el primer día, el control cubre las dos rutas de ejecución de shell en ShellTools (executeTCC y executeTCCStreaming).
Diseñado para no bloquear nunca tu tarea
Un asesor capaz de bloquear a tu agente es peligroso a su manera. Si el servicio no está disponible, ¿se queda colgada tu tarea nocturna? Aquí la respuesta es no. JevAdvisor es fail-open. Sin clave, con el interruptor desactivado o ante una caída del servicio, significa «sin opinión», y el comando sigue adelante.
Sin embargo, el fail-open solo es seguro si es visible. En el primer día, dos cambios posteriores se aseguraron de ello:
- «Hacer observable al asesor» (
e25384f3) añadió un callback de uso y notificación de errores, para que una comprobación fallida quede registrada en lugar de parecer, en silencio, «segura». - «Registrar el veredicto, no solo que Jev respondió» (
d3c47e67) hizo que cada comprobación muestre el resultado real: el porcentaje de riesgo destructivo y si el comando se permitió o se rechazó.
El cliente es un paquete de verdad
La primera versión usaba un cliente HTTP hecho a mano: POST /v1/systemone para las preguntas, GET /v1/models para la lista de modelos, autenticación Bearer y backoff ante respuestas 429 y 529. En cuestión de horas, 9e330357 lo sustituyó por el paquete TypeSafeKit, y f3a817b8 incorporó el paquete dentro del repositorio de Agent para que una compilación nunca dependa de descargarlo.
Configuración
Jev se encuentra en Ajustes con su propia clave de API, almacenada en el Llavero en un espacio dedicado que no pertenece a ningún proveedor. Tiene un selector de modelo, cargado desde /v1/models, y un interruptor de asesoramiento. Desactiva el interruptor y Agent! se comporta exactamente como antes.
Por qué es importante
Los agentes están obteniendo acceso a la shell en todas partes, y la respuesta habitual en materia de seguridad es «el modelo tendrá cuidado». Las reglas basadas en patrones son mejores, porque son verificables. Pero solo conocen los patrones que alguien dejó escritos. Una segunda opinión tipada aporta criterio sin añadir ambigüedad: devuelve un número y el código toma la decisión.
Iremos ajustando el umbral predeterminado y vigilando los registros. Si Jev rechaza algo que no debería o se le escapa algo que debería haber detectado, abre una incidencia en GitHub e incluye la línea del registro.