Ejecución de código

ADK-Rust proporciona ejecución de código mediante dos crates:

  • adk-sandbox — Entorno de ejecución aislado con ProcessBackend (subproceso) y WasmBackend (wasmtime)
  • adk-code — Cadena de herramientas adaptada al lenguaje con RustExecutor (canalización de comprobación, compilación y ejecución) y CodeTool

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

CapacidadProcessBackendWasmBackendEmbeddedJsExecutorEjecutores de MontyDockerExecutor
Tiempo de esperaAplicadoAplicadoAplicadoAplicado (en la VM)Aplicado
Límite de memoriaNo aplicadoAplicadoNo aplicadoAplicadoLímites del contenedor
Aislamiento de redNo aplicadoSin red WASINo hay API disponibleNo hay API disponibleConfigurable
Aislamiento del sistema de archivosNo aplicadoSin preaperturas WASINo hay API disponibleSolo montajes otorgadosConfigurable
Aislamiento del entornoenv_clear()CompletoNo hay API disponibleSolo el mapa otorgadoConfigurable
LenguajesRust, Python, JS, TS, ComandoWasmJavaScriptPythonPython, 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

HerramientaCrateNombreLenguajeÁmbitos
CodeTooladk-codecode_execRustcode:execute, code:execute:rust
SandboxTooladk-sandboxsandbox_execMultilenguajecode:execute
PythonCodeTooladk-toolpython_codePython (CPython respaldado por contenedor)code:execute, code:execute:container
MontyPythonCodeTooladk-toolmonty_python_codePython (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:

EliminadoSustituciónPaquete
RustCodeTool (eliminado en 0.8.0)CodeTooladk-code
RustSandboxExecutorRustExecutoradk-code
ExecutionRequestExecRequestadk-sandbox
ExecutionResultExecResultadk-sandbox
CodeExecutorSandboxBackendadk-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