Ejecución de código
ADK-Rust proporciona ejecución de código mediante dos crates:
adk-sandbox— Entorno de ejecución aislado conProcessBackend(subproceso) yWasmBackend(wasmtime)adk-code— Cadena de herramientas adaptada al lenguaje conRustExecutor(canalización de comprobación, compilación y ejecución) yCodeTool
La separación es intencionada: adk-sandbox gestiona el aislamiento, mientras que adk-code gestiona la compilación y la lógica específica del lenguaje.
Inicio rápido
use adk_code::{CodeTool, RustExecutor, RustExecutorConfig};
use adk_sandbox::ProcessBackend;
use std::sync::Arc;
let backend = Arc::new(ProcessBackend::default());
let executor = RustExecutor::new(backend, RustExecutorConfig::default());
let tool = Arc::new(CodeTool::new(executor));
let agent = LlmAgentBuilder::new("code_agent")
.instruction("Execute Rust code when asked to compute something.")
.model(model)
.tool(tool)
.build()?;
Para ejecutar directamente en el entorno aislado sin la canalización de compilación de Rust:
use adk_sandbox::{SandboxTool, ProcessBackend};
use std::sync::Arc;
let backend = Arc::new(ProcessBackend::default());
let tool = Arc::new(SandboxTool::new(backend));
Arquitectura
CodeTool añade una canalización de compilación de Rust (comprobar errores, compilar el binario y después ejecutarlo). SandboxTool ejecuta el código directamente mediante el backend, sin compilación.
Matriz de capacidades del backend
| Capacidad | ProcessBackend | WasmBackend | EmbeddedJsExecutor | Ejecutores de Monty | DockerExecutor |
|---|---|---|---|---|---|
| Tiempo de espera | Aplicado | Aplicado | Aplicado | Aplicado (en la VM) | Aplicado |
| Límite de memoria | No aplicado | Aplicado | No aplicado | Aplicado | Límites del contenedor |
| Aislamiento de red | No aplicado | Sin red WASI | No hay API disponible | No hay API disponible | Configurable |
| Aislamiento del sistema de archivos | No aplicado | Sin preaperturas WASI | No hay API disponible | Solo montajes otorgados | Configurable |
| Aislamiento del entorno | env_clear() | Completo | No hay API disponible | Solo el mapa otorgado | Configurable |
| Lenguajes | Rust, Python, JS, TS, Comando | Wasm | JavaScript | Python | Python, Node.js |
ProcessBackend es transparente sobre lo que no aplica. Usa WasmBackend para un aislamiento completo o DockerExecutor para el aislamiento a nivel de contenedor.
Herramientas
| Herramienta | Crate | Nombre | Lenguaje | Ámbitos |
|---|---|---|---|---|
CodeTool | adk-code | code_exec | Rust | code:execute, code:execute:rust |
SandboxTool | adk-sandbox | sandbox_exec | Multilenguaje | code:execute |
PythonCodeTool | adk-tool | python_code | Python (CPython respaldado por contenedor) | code:execute, code:execute:container |
MontyPythonCodeTool | adk-tool | monty_python_code | Python (Monty en proceso) | code:execute |
CodeTool, SandboxTool y MontyPythonCodeTool siguen el patrón de error como información: los errores se devuelven como JSON estructurados con un campo "status", nunca como ToolError. Esto permite que los agentes razonen sobre los fallos. PythonCodeTool es la excepción: devuelve un ToolError cuando falta el argumento code y para los fallos a nivel del ejecutor; solo los fallos a nivel del script se presentan como datos.
Para la ejecución de Python en el proceso —modos de ejecución única y REPL, concesiones de acceso al sistema operativo y funciones del host— consulta Ejecución de código Python.
Diagnósticos estructurados
CodeTool devuelve diagnósticos del compilador analizados para errores de compilación de Rust:
{
"status": "compile_error",
"diagnostics": [
{
"level": "error",
"message": "expected `;`",
"code": "E0308",
"spans": [{ "file_name": "main.rs", "line_start": 3, "column_start": 15 }]
}
],
"stderr": "error: expected `;`"
}
Las respuestas correctas incluyen una salida estructurada extraída del arnés:
{
"status": "success",
"stdout": "",
"output": { "greeting": "hello" },
"exit_code": 0,
"duration_ms": 42
}
Contrato del código Rust
El código del usuario debe proporcionar fn run(input: serde_json::Value) -> serde_json::Value. El arnés lo envuelve con fn main(), el análisis de stdin y la serialización de stdout. El código del usuario no debe definir fn main() ni usar atributos a nivel de crate (#![...]).
Migración desde API anterior
Los tipos adk-code anteriores (CodeExecutor, ExecutionRequest, RustSandboxExecutor) y RustCodeTool de adk-tool se han eliminado. Usa los nuevos tipos en su lugar:
| Eliminado | Sustitución | Paquete |
|---|---|---|
RustCodeTool (eliminado en 0.8.0) | CodeTool | adk-code |
RustSandboxExecutor | RustExecutor | adk-code |
ExecutionRequest | ExecRequest | adk-sandbox |
ExecutionResult | ExecResult | adk-sandbox |
CodeExecutor | SandboxBackend | adk-sandbox |
Consulta adk_code::compat para obtener la guía de migración completa.
Navegador JavaScript
La ejecución de JavaScript en páginas del navegador mediante adk-browser es una capacidad independiente. Se ejecuta dentro del contexto de la página remota y no forma parte del entorno de ejecución de código. Usa las herramientas de adk-browser para la automatización web y la interacción con páginas.
Integración con Studio
ADK Studio utiliza el mismo flujo de ejecución de código:
- Ejecutor en vivo: Ejecuta Rust escrito mediante
RustExecutor+ProcessBackend - Generación de código: Inserta el mismo cuerpo de Rust en proyectos generados
- Configuración del entorno aislado: Se asigna a capacidades que el backend puede hacer cumplir