Exécution de code

ADK-Rust fournit l’exĂ©cution de code via deux crates :

  • adk-sandbox — Environnement d’exĂ©cution isolĂ© avec ProcessBackend (sous-processus) et WasmBackend (wasmtime)
  • adk-code — ChaĂźne d’outils adaptĂ©e au langage avec RustExecutor (pipeline de vĂ©rification, compilation et exĂ©cution) et CodeTool

La sĂ©paration est intentionnelle : adk-sandbox gĂšre l’isolation, tandis que adk-code gĂšre la compilation et la logique spĂ©cifique au langage.

Démarrage rapide

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()?;

Pour une exécution directe dans le bac à sable sans le pipeline de compilation Rust :

use adk_sandbox::{SandboxTool, ProcessBackend};
use std::sync::Arc;

let backend = Arc::new(ProcessBackend::default());
let tool = Arc::new(SandboxTool::new(backend));

Architecture

CodeTool ajoute un pipeline de compilation Rust (vérification des erreurs, compilation du binaire, puis exécution). SandboxTool exécute directement le code via le backend, sans compilation.

Matrice des capacités des backends

CapacitéProcessBackendWasmBackendEmbeddedJsExecutorExécuteurs MontyDockerExecutor
DĂ©lai d’expirationAppliquĂ©AppliquĂ©AppliquĂ©AppliquĂ© (dans la VM)AppliquĂ©
Limite de mémoireNon appliquéeAppliquéeNon appliquéeAppliquéeLimites du conteneur
Isolation réseauNon appliquéeAucun réseau WASIAucun API disponibleAucun API disponibleConfigurable
Isolation du systÚme de fichiersNon appliquéeAucun préouverture WASIAucun API disponibleMontages accordés uniquementConfigurable
Isolation de l’environnementenv_clear()ComplĂšteAucun API disponibleCarte accordĂ©e uniquementConfigurable
LangagesRust, Python, JS, TS, CommandeWasmJavaScriptPythonPython, Node.js

ProcessBackend est transparent quant à ce qu’il n’impose pas. Utilisez WasmBackend pour une mise en bac à sable complùte ou DockerExecutor pour une isolation au niveau du conteneur.

Outils

OutilCrateNomLangagePortées
CodeTooladk-codecode_execRustcode:execute, code:execute:rust
SandboxTooladk-sandboxsandbox_execMultilinguecode:execute
PythonCodeTooladk-toolpython_codePython (CPython basé sur un conteneur)code:execute, code:execute:container
MontyPythonCodeTooladk-toolmonty_python_codePython (Monty intégré au processus)code:execute

CodeTool, SandboxTool et MontyPythonCodeTool suivent le modĂšle des erreurs comme informations : les erreurs sont renvoyĂ©es sous forme de JSON structurĂ©es avec un champ "status", jamais sous forme de ToolError. Cela permet aux agents de raisonner sur les Ă©checs. PythonCodeTool constitue l’exception : il renvoie un ToolError en cas d’argument code manquant et pour les Ă©checs au niveau de l’exĂ©cuteur ; seuls les Ă©checs au niveau du script sont exposĂ©s sous forme de donnĂ©es.

Pour l’exĂ©cution de Python en processus — modes Ă  exĂ©cution unique et REPL, autorisations d’accĂšs au systĂšme d’exploitation et fonctions hĂŽtes — consultez ExĂ©cution de code Python.

Diagnostics structurés

CodeTool renvoie les diagnostics du compilateur analysés pour les erreurs de compilation 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 `;`"
}

Les réponses en cas de réussite incluent la sortie structurée extraite du harnais :

{
  "status": "success",
  "stdout": "",
  "output": { "greeting": "hello" },
  "exit_code": 0,
  "duration_ms": 42
}

Contrat du code Rust

Le code utilisateur doit fournir fn run(input: serde_json::Value) -> serde_json::Value. Le harnais l’enveloppe avec fn main(), l’analyse de stdin et la sĂ©rialisation de stdout. Le code utilisateur ne doit pas dĂ©finir fn main() ni utiliser d’attributs au niveau de la crate (#![...]).

Migration depuis API précédent

Les types adk-code précédents (CodeExecutor, ExecutionRequest, RustSandboxExecutor) ainsi que le RustCodeTool de adk-tool ont été supprimés. Utilisez plutÎt les nouveaux types :

SuppriméRemplacementCrate
RustCodeTool (supprimé dans la version 0.8.0)CodeTooladk-code
RustSandboxExecutorRustExecutoradk-code
ExecutionRequestExecRequestadk-sandbox
ExecutionResultExecResultadk-sandbox
CodeExecutorSandboxBackendadk-sandbox

Voir adk_code::compat pour le guide complet de migration.

Navigateur JavaScript

L’exĂ©cution de pages dans le navigateur JavaScript via adk-browser constitue une fonctionnalitĂ© distincte. Elle s’exĂ©cute dans le contexte de la page distante et ne fait pas partie de la plateforme d’exĂ©cution du code. Utilisez les outils adk-browser pour l’automatisation du Web et l’interaction avec les pages.

Intégration de Studio

ADK Studio utilise le mĂȘme pipeline d’exĂ©cution du code :

  • ExĂ©cuteur en direct : exĂ©cute le code Rust rĂ©digĂ© via RustExecutor + ProcessBackend
  • GĂ©nĂ©ration de code : intĂšgre le mĂȘme corps Rust dans les projets gĂ©nĂ©rĂ©s
  • ParamĂštres du bac Ă  sable : correspondent aux capacitĂ©s pouvant ĂȘtre appliquĂ©es par le backend
Exécution de code - Documentation ADK-Rust | ADK-Rust