Executando o subconjunto Python em sandbox Monty Rust do Pydantic no WebAssembly

Executando o subconjunto Python em sandbox Monty Rust do Pydantic no WebAssembly


Executando o subconjunto Python em sandbox Monty Rust do Pydantic no WebAssembly

6 de fevereiro de 2026

Há um título cheio de jargões para você! Todo mundo está construindo sandboxes para executar código não confiável agora, e a última tentativa do Pydantic, Monty, fornece uma linguagem personalizada semelhante ao Python (um subconjunto do Python) em Rust e a disponibiliza como uma biblioteca Rust e um pacote Python. Eu fiz funcionar no WebAssembly, fornecendo um sandbox em um sandbox.

Veja como eles descrevem Monty:

Monty evita o custo, a latência, a complexidade e o incômodo geral de usar sandbox completo baseado em contêiner para executar o código gerado pelo LLM.

Em vez disso, ele permite que você execute com segurança o código Python escrito por um LLM incorporado em seu agente, com tempos de inicialização medidos em microssegundos de um dígito e não em centenas de milissegundos.

O que Monty pode fazer:

  • Execute um subconjunto razoável de código Python – o suficiente para que seu agente expresse o que deseja fazer
  • Bloqueie completamente o acesso ao ambiente host: sistema de arquivos, variáveis ​​de ambiente e acesso à rede são todos implementados por meio de chamadas de função externas que o desenvolvedor pode controlar
  • Chame funções no host – apenas funções às quais você dá acesso (…)

Uma maneira rápida de experimentar é via uv:

uv run --with pydantic-monty python -m asyncio

Em seguida, cole isso no prompt interativo do Python – o -m asyncio ativa a espera de nível superior:

import pydantic_monty
code = pydantic_monty.Monty('print("hello " + str(4 * 5))')
await pydantic_monty.run_monty_async(code)

Monty apoia um muito pequeno subconjunto do Python — ele ainda nem suporta declarações de classe!

Mas, dado o caso de uso alvo, isso não é realmente um problema.

O interessante de fornecer ferramentas como essa para LLMs é que elas são realmente boas em iterar mensagens de erro. Um agente de codificação pode executar algum código Python, receber uma mensagem de erro informando que as classes não são suportadas e tentar novamente com uma abordagem diferente.

Eu queria tentar isso em um navegador, então iniciei uma tarefa de pesquisa de código no Claude Code para web e comecei com o seguinte:

Clone https://github.com/pydantic/monty para /tmp e descubra como compilá-lo em uma roda python WebAssembly que pode então ser carregada no Pyodide. O arquivo wheel em si deve ser verificado no repositório junto com os scripts de construção e aprovação nos scripts de teste do dramaturgo pytest que carregam o Pyodide de um CDN e o wheel de um host local “python -m http.server” e demonstram seu funcionamento

Então um pouco mais tarde:

Quero um arquivo WASM adicional que funcione independentemente do Pyodide, que também possa ser usado em um navegador da web – construa-o também junto com testes de dramaturgo que mostram que ele funciona. Crie também dois arquivos HTML – um chamado demo.html e outro chamado pyodide-demo.html – eles devem funcionar de forma semelhante a https://tools.simonwillison.net/micropython (baixe esse código com curl para inspecioná-lo) – um deve carregar a compilação WASM, o outro deve carregar o Pyodide e fazer com que ele use a roda WASM. Eles serão servidos pelas páginas do GitHub para que possam carregar o WASM e o wheel a partir de um caminho relativo, já que os arquivos .html serão servidos na mesma pasta que o wheel e o arquivo WASM

Aqui está a transcrição e o relatório final da pesquisa produzido.

Agora tenho o código Monty Rust compilado para WebAssembly em duas formas diferentes – como um .wasm pacote você pode carregar e chamar de JavaScript, e como um monty-wasm-pyodide/pydantic_monty-0.0.3-cp313-cp313-emscripten_4_0_9_wasm32.whl arquivo wheel que pode ser carregado no Pyodide e então chamado do Python no Pyodide no WebAssembly em um navegador.

Aqui estão essas duas demonstrações, hospedadas nas páginas do GitHub:

Captura de tela de um aplicativo da web intitulado "Monty via Piodide" com descrição "Execute Monty (um interpretador Python em sandbox da Pydantic) dentro do Pyodide (CPython compilado para WebAssembly). Isso carrega a roda pydantic-monty e usa sua API Python completa. O código é salvo na URL para compartilhamento." Uma faixa verde diz "Código executado com sucesso!" Abaixo estão exemplos de botões rotulados "Básico", "Entradas", "Reutilizar", "Tratamento de erros", "Fibonacci"e "Aulas". Um editor de código rotulado "Código Python (executa dentro da sandbox Monty via Pyodide):" contém: "import pydantic_monty\n\n# Criar interpretador com variáveis ​​de entrada\nm = pydantic_monty.Monty('x + y', inputs=('x', 'y'))\n\n# Executar com entradas diferentes\nresult1 = m.run(inputs={"x": 10, "sim": 20})\nprint(f"10 + 20 = {resultado1}")\n\nresultado2 = m.run(entradas={"x": 100, "sim": 200})" com "Executar código" e "Claro" botões. A seção Saída mostra "10 + 20 = 30" e "100 + 200 = 300" com um "Cópia" botão. Leituras de rodapé "Executado em 4,0ms".

Como um conhecedor de sandboxes – quanto mais opções, melhor! – esta nova entrada do Pydantic atende a muitos dos meus requisitos. É pequeno, rápido, amplamente disponível (graças ao Rust e WebAssembly) e fornece limites rígidos de uso de memória, tempo de CPU e acesso ao disco e à rede.

Também foi uma ótima desculpa para lançar outra demonstração mostrando como é fácil hoje em dia transformar código compilado como C ou Rust em WebAssembly que roda tanto em um navegador quanto em um ambiente Pyodide.



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *