Exécution de code
ADK-Rust fournit lâexĂ©cution de code via deux crates :
adk-sandboxâ Environnement dâexĂ©cution isolĂ© avecProcessBackend(sous-processus) etWasmBackend(wasmtime)adk-codeâ ChaĂźne dâoutils adaptĂ©e au langage avecRustExecutor(pipeline de vĂ©rification, compilation et exĂ©cution) etCodeTool
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é | ProcessBackend | WasmBackend | EmbeddedJsExecutor | Exécuteurs Monty | DockerExecutor |
|---|---|---|---|---|---|
| DĂ©lai dâexpiration | AppliquĂ© | AppliquĂ© | AppliquĂ© | AppliquĂ© (dans la VM) | AppliquĂ© |
| Limite de mémoire | Non appliquée | Appliquée | Non appliquée | Appliquée | Limites du conteneur |
| Isolation réseau | Non appliquée | Aucun réseau WASI | Aucun API disponible | Aucun API disponible | Configurable |
| Isolation du systÚme de fichiers | Non appliquée | Aucun préouverture WASI | Aucun API disponible | Montages accordés uniquement | Configurable |
| Isolation de lâenvironnement | env_clear() | ComplĂšte | Aucun API disponible | Carte accordĂ©e uniquement | Configurable |
| Langages | Rust, Python, JS, TS, Commande | Wasm | JavaScript | Python | Python, 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
| Outil | Crate | Nom | Langage | Portées |
|---|---|---|---|---|
CodeTool | adk-code | code_exec | Rust | code:execute, code:execute:rust |
SandboxTool | adk-sandbox | sandbox_exec | Multilingue | code:execute |
PythonCodeTool | adk-tool | python_code | Python (CPython basé sur un conteneur) | code:execute, code:execute:container |
MontyPythonCodeTool | adk-tool | monty_python_code | Python (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é | Remplacement | Crate |
|---|---|---|
RustCodeTool (supprimé dans la version 0.8.0) | CodeTool | adk-code |
RustSandboxExecutor | RustExecutor | adk-code |
ExecutionRequest | ExecRequest | adk-sandbox |
ExecutionResult | ExecResult | adk-sandbox |
CodeExecutor | SandboxBackend | adk-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