Codeausführung
ADK-Rust bietet Codeausführung über zwei Crates:
adk-sandbox— Isolierte Laufzeitumgebung für die Ausführung mitProcessBackend(Subprozess) undWasmBackend(wasmtime)adk-code— Sprachbewusste Toolchain mitRustExecutor(Prüfen-, Erstellen- und Ausführungspipeline) undCodeTool
Die Trennung ist beabsichtigt: adk-sandbox übernimmt die Isolation, adk-code die Kompilierung und sprachspezifische Logik.
Schnellstart
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()?;
Für die direkte Sandbox-Ausführung ohne die Rust-Kompilierungspipeline:
use adk_sandbox::{SandboxTool, ProcessBackend};
use std::sync::Arc;
let backend = Arc::new(ProcessBackend::default());
let tool = Arc::new(SandboxTool::new(backend));
Architektur
CodeTool fügt eine Rust-Kompilierungspipeline hinzu (auf Fehler prüfen, Binärdatei erstellen und anschließend ausführen). SandboxTool führt Code direkt über das Backend ohne Kompilierung aus.
Backend-Fähigkeitsmatrix
| Fähigkeit | ProcessBackend | WasmBackend | EmbeddedJsExecutor | Monty-Ausführungen | DockerExecutor |
|---|---|---|---|---|---|
| Zeitüberschreitung | Erzwingung | Erzwingung | Erzwingung | Erzwingung (in der VM) | Erzwingung |
| Speicherlimit | Nicht erzwungen | Erzwungen | Nicht erzwungen | Erzwungen | Container-Limits |
| Netzwerkisolation | Nicht erzwungen | Kein WASI-Netzwerk | Kein API verfügbar | Kein API verfügbar | Konfigurierbar |
| Dateisystemisolation | Nicht erzwungen | Keine WASI-Preopens | Kein API verfügbar | Nur bereitgestellte Mounts | Konfigurierbar |
| Umgebungsisolation | env_clear() | Vollständig | Kein API verfügbar | Nur bereitgestellte Map | Konfigurierbar |
| Sprachen | Rust, Python, JS, TS, Befehl | Wasm | JavaScript | Python | Python, Node.js |
ProcessBackend ist ehrlich in Bezug auf das, was es nicht erzwingt. Verwenden Sie WasmBackend für vollständiges Sandboxing oder DockerExecutor für Isolation auf Containerebene.
Werkzeuge
| Werkzeug | Crate | Name | Sprache | Bereiche |
|---|---|---|---|---|
CodeTool | adk-code | code_exec | Rust | code:execute, code:execute:rust |
SandboxTool | adk-sandbox | sandbox_exec | Mehrsprachig | code:execute |
PythonCodeTool | adk-tool | python_code | Python (containergestütztes CPython) | code:execute, code:execute:container |
MontyPythonCodeTool | adk-tool | monty_python_code | Python (prozessinternes Monty) | code:execute |
CodeTool, SandboxTool und MontyPythonCodeTool folgen dem Muster „Fehler als Information“: Fehler werden als strukturierte JSON mit einem Feld "status" zurückgegeben, niemals als ToolError. Dadurch können Agents Fehler analysieren. PythonCodeTool ist die Ausnahme — es gibt bei einem fehlenden Argument code und bei Fehlern auf Executor-Ebene ein ToolError zurück; nur Fehler auf Skriptebene werden als Daten ausgegeben.
Für die Python-Ausführung innerhalb des Prozesses — Einmal- und REPL-Modi, Berechtigungen für den Betriebssystemzugriff und Host-Funktionen — siehe Python-Codeausführung.
Strukturierte Diagnosen
CodeTool gibt geparste Compilerdiagnosen für Rust-Kompilierungsfehler zurück:
{
"status": "compile_error",
"diagnostics": [
{
"level": "error",
"message": "expected `;`",
"code": "E0308",
"spans": [{ "file_name": "main.rs", "line_start": 3, "column_start": 15 }]
}
],
"stderr": "error: expected `;`"
}
Erfolgsantworten enthalten eine strukturierte Ausgabe, die aus dem Harness extrahiert wurde:
{
"status": "success",
"stdout": "",
"output": { "greeting": "hello" },
"exit_code": 0,
"duration_ms": 42
}
Rust-Codevertrag
Der Benutzercode muss fn run(input: serde_json::Value) -> serde_json::Value bereitstellen. Das Harness umschließt ihn mit fn main(), der Verarbeitung von stdin und der Serialisierung von stdout. Der Benutzercode darf fn main() nicht definieren und keine Attribute auf Crate-Ebene (#![...]) verwenden.
Migration von API
Die bisherigen adk-code-Typen (CodeExecutor, ExecutionRequest, RustSandboxExecutor) und RustCodeTool von adk-tool wurden entfernt. Verwenden Sie stattdessen die neuen Typen:
| Entfernt | Ersatz | Crate |
|---|---|---|
RustCodeTool (in 0.8.0 entfernt) | CodeTool | adk-code |
RustSandboxExecutor | RustExecutor | adk-code |
ExecutionRequest | ExecRequest | adk-sandbox |
ExecutionResult | ExecResult | adk-sandbox |
CodeExecutor | SandboxBackend | adk-sandbox |
Siehe adk_code::compat für den vollständigen Migrationsleitfaden.
Browser JavaScript
Die Ausführung von Browser-Seiten JavaScript über adk-browser ist eine separate Funktion. Sie läuft im Kontext der entfernten Seite und ist nicht Teil der Codeausführungsumgebung. Verwenden Sie die Tools adk-browser für Webautomatisierung und die Interaktion mit Seiten.
Studio-Integration
ADK Studio verwendet dieselbe Pipeline zur Codeausführung:
- Live-Ausführung: Führt verfassten Rust-Code über
RustExecutor+ProcessBackendaus - Codegenerierung: Bettet denselben Rust-Code in generierte Projekte ein
- Sandbox-Einstellungen: Werden auf vom Backend durchsetzbare Funktionen abgebildet.