Codeausführung

ADK-Rust bietet Codeausführung über zwei Crates:

  • adk-sandbox — Isolierte Laufzeitumgebung für die Ausführung mit ProcessBackend (Subprozess) und WasmBackend (wasmtime)
  • adk-code — Sprachbewusste Toolchain mit RustExecutor (Prüfen-, Erstellen- und Ausführungspipeline) und CodeTool

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ähigkeitProcessBackendWasmBackendEmbeddedJsExecutorMonty-AusführungenDockerExecutor
ZeitüberschreitungErzwingungErzwingungErzwingungErzwingung (in der VM)Erzwingung
SpeicherlimitNicht erzwungenErzwungenNicht erzwungenErzwungenContainer-Limits
NetzwerkisolationNicht erzwungenKein WASI-NetzwerkKein API verfügbarKein API verfügbarKonfigurierbar
DateisystemisolationNicht erzwungenKeine WASI-PreopensKein API verfügbarNur bereitgestellte MountsKonfigurierbar
Umgebungsisolationenv_clear()VollständigKein API verfügbarNur bereitgestellte MapKonfigurierbar
SprachenRust, Python, JS, TS, BefehlWasmJavaScriptPythonPython, 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

WerkzeugCrateNameSpracheBereiche
CodeTooladk-codecode_execRustcode:execute, code:execute:rust
SandboxTooladk-sandboxsandbox_execMehrsprachigcode:execute
PythonCodeTooladk-toolpython_codePython (containergestütztes CPython)code:execute, code:execute:container
MontyPythonCodeTooladk-toolmonty_python_codePython (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:

EntferntErsatzCrate
RustCodeTool (in 0.8.0 entfernt)CodeTooladk-code
RustSandboxExecutorRustExecutoradk-code
ExecutionRequestExecRequestadk-sandbox
ExecutionResultExecResultadk-sandbox
CodeExecutorSandboxBackendadk-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 + ProcessBackend aus
  • Codegenerierung: Bettet denselben Rust-Code in generierte Projekte ein
  • Sandbox-Einstellungen: Werden auf vom Backend durchsetzbare Funktionen abgebildet.
Codeausführung - ADK-Rust Dokumentation | ADK-Rust