- Intérprete ligero de Python basado en Rust diseñado para ejecutar de forma segura código generado por IA, eliminando la complejidad y la latencia de los sandboxes con contenedores
- Bloquea por completo el acceso al sistema de archivos, variables de entorno y red, y solo permite llamar funciones externas que el desarrollador haya autorizado
- Ofrece un tiempo de arranque inferior a 1 microsegundo y un rendimiento de ejecución similar a CPython, además de poder invocarse desde Rust, Python y JavaScript
- El estado de ejecución puede guardarse y restaurarse como snapshot a nivel de bytes, lo que permite pausar y reanudar entre procesos
- Está previsto que impulse la función Code Mode de Pydantic AI, y se usará como componente clave para ejecutar de forma segura código Python escrito por LLMs
Resumen de Monty
- Monty es un intérprete experimental de Python escrito en Rust, creado para ejecutar de forma segura código generado por IA
- Evita el costo, la latencia y la complejidad de los sandboxes basados en contenedores, y permite ejecutar directamente código Python escrito por LLMs
- Su tiempo de arranque está en el orden de unos pocos microsegundos, mucho más rápido que los cientos de milisegundos típicos de un contenedor
- Funciones disponibles
- Soporta la ejecución de parte de la sintaxis de Python, incluida la verificación estática de tipos basada en type hints
- Bloqueo total del acceso al host; las llamadas a funciones externas solo son posibles para aquellas que el desarrollador haya permitido explícitamente
- Puede invocarse desde Rust, Python y JavaScript, e incluye funciones integradas para rastrear y limitar el uso de recursos
- Soporta recolección de stdout/stderr, ejecución de código asíncrono y guardado y restauración de snapshots
- Limitaciones
- La biblioteca estándar disponible se limita a
sys, typing, asyncio, dataclasses(próximamente), json(próximamente)
- Las definiciones de clases y la sentencia match aún no son compatibles
- Las bibliotecas de terceros no están contempladas
- El objetivo de diseño es uno solo: ejecutar de forma segura código escrito por agentes
Integración con Pydantic AI
- Monty impulsa Code Mode de Pydantic AI
- En lugar de llamadas a herramientas, el LLM escribe código Python, y Monty lo ejecuta de forma segura
- En el ejemplo, se definen herramientas funcionales como
get_weather y get_population, y el LLM escribe código que las llama
Comparación con tecnologías alternativas
- Monty tiene una completitud de lenguaje limitada, pero destaca en seguridad, velocidad y simplicidad
- Latencia de arranque de 0.06 ms, gratis, instalación sencilla y soporte de snapshots
- Resumen comparativo con otras tecnologías:
- Docker: entorno CPython completo, buena seguridad pero latencia de arranque de 195 ms
- Pyodide: basado en WASM, seguridad débil y latencia de arranque de 2800 ms
- starlark-rust: lenguaje muy limitado, rápido pero distinto de Python
- servicios de sandboxing: seguridad sólida pero con costo, latencia y configuración compleja
- YOLO Python(exec/subprocess): rápido pero sin ninguna seguridad
- Monty proporciona un entorno seguro de Python para ejecutar código de IA mediante funciones de control de acceso a archivos, límites de recursos y pausa/reanudación basada en snapshots
1 comentarios
Comentarios en Hacker News
Probé ejecutar una versión compilada con WebAssembly. Hice un playground web donde se puede probar directamente
Todavía no hay soporte para clases, pero cuando el LLM intenta usarlas, ve el error y reescribe el código por su cuenta para no usar clases
Hay un artículo que resume el proceso de compilación aquí
Si la ventaja de un agente de terminal es el acceso a red y sistema de archivos, entonces un contenedor sandbox se siente como una extensión más natural
Uso Typescript, C# y Python sin problemas
Me hizo recordar la época en que usaba Mercurial antes de pasarme a Git. En ese entonces Git era lo que todos usaban porque estaba de moda, pero yo sentía que el UX de Mercurial era mucho mejor
Ahora todos escriben
execde agentes en Python, pero a mí me parece que TypeScript/JS encaja mejor. Es rápido, seguro y, gracias a los tipos, tiene mayor densidad de información. Pero esta vez también siento que me va a tocar perderPersonalmente me gusta más el sistema de tipos estáticos de TypeScript, pero en velocidad o seguridad ambos lenguajes están más o menos en el mismo nivel
Python tiene muy buen ecosistema para este tipo de procesamiento, y con herramientas como Pyodide o ty también se pueden mitigar los problemas de seguridad
Ahora hasta NVIDIA da soporte oficial para escribir kernels en Python
Este proyecto es una aproximación interesante al problema del sandboxing. Hace tiempo, en un experimento llamado jsrun, metieron V8 dentro de Python para ejecutar JS de forma segura
Monty parece apuntar a algo parecido. Empezar con un intérprete mínimo encaja bien con cargas de trabajo de IA, pero lidiar con la larga cola de la sintaxis de Python no es fácil
El punto de equilibrio importante está en reducir la superficie por seguridad y previsibilidad, sin dejar de ofrecer suficiente funcionalidad como para manejar el código complejo que generan los LLM
Esto ya es otra cosa, pero me hizo pensar en el libro de Monty Roberts, The Man Who Listens to Horses.
Trata sobre aprender el lenguaje de los animales, y dejo el link del libro y un video
Me llamó la atención la descripción de “ejecutar de forma segura y ultrarrápida código Python escrito por LLM”.
Aun así, incluso runtimes basados en Rust como
uvtardan como mínimo unos 10 ms, así que lo de microsegundos suena difícilDe todas formas, la idea de un mini intérprete sin biblioteca estándar está buena. También es novedosa desde el punto de vista del sandboxing para IA, y no esperaba algo así de Pydantic
uves un runtime escrito en RustYo creo que sería mejor crear un lenguaje estricto dedicado a IA en vez de reciclar lenguajes existentes
La IA entiende bien las especificaciones, así que no necesita una gramática flexible pensada para humanos.
Al contrario, un lenguaje que obligue a una estructura precisa y un formato consistente sería más adecuado.
Yo mismo estoy experimentando con algo así, porque creo que a la generación de código por IA se le puede exigir más disciplina que a los humanos
Es mucho más realista tomar un modelo que ya sabe bien Python y limitarlo con algo como “usa solo esta función”
El punto de jstanley sobre las pequeñas molestias (papercuts) es válido, pero por otro lado, cuando se ejecuta a gran escala código generado por IA, el riesgo de seguridad es todavía mayor
Abrirle a un CPython completo cosas como I/O de archivos, red o subprocess es peligroso
Igual la restricción con clases es rara. No tiene que ver con seguridad, solo hace que el código quede más desprolijo.
Probablemente sea un enfoque de “arrancar con la mínima funcionalidad e ir expandiendo poco a poco”
Es interesante el enfoque de construir el intérprete mínimo necesario para código de IA, en vez de intentar imitar toda la funcionalidad de CPython
Un runtime completo tiene una superficie de ataque demasiado grande, pero un subconjunto limitado es más seguro
También suena realista la estrategia de usar la retroalimentación de errores para que el LLM se adapte por sí solo a una sintaxis limitada.
En la mayoría de los escenarios de uso de herramientas no hacen falta metaclases ni imports dinámicos
Pregunta simple: ¿no bastaría con limitar las llamadas al sistema usando seccomp?
Si se quiere bloquear el acceso a archivos, debería alcanzar con bloquear los syscalls relacionados, así que me pregunto por qué haría falta un intérprete aparte
Si se empieza desde el principio con un runtime extremadamente simple, la superficie de ataque es pequeña y resulta mucho más seguro
El proyecto en sí parece razonable, pero eso de “herramienta ultrarrápida para IA” me causa gracia
La velocidad de pensamiento de la IA ya es tan lenta que, por más rápido que sea ejecutar el código, la diferencia total percibida no cambia mucho
Es como hacer entregas junto a un compañero que trabaja al lado tuyo a la velocidad de un glaciar moviéndose