コード実行
ADK-Rustは、2つのクレートを通じてコード実行を提供します。
adk-sandbox—ProcessBackend(サブプロセス)およびWasmBackend(wasmtime)を使用した分離実行ランタイムadk-code—RustExecutor(チェック、ビルド、実行のパイプライン)およびCodeToolを備えた言語対応ツールチェーン
この分離は意図的なものです。adk-sandboxは分離を処理し、adk-codeはコンパイルと言語固有のロジックを処理します。
クイックスタート
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()?;
Rustのコンパイルパイプラインを使用せずに、サンドボックスで直接実行する場合:
use adk_sandbox::{SandboxTool, ProcessBackend};
use std::sync::Arc;
let backend = Arc::new(ProcessBackend::default());
let tool = Arc::new(SandboxTool::new(backend));
アーキテクチャ
CodeToolはRustのコンパイルパイプライン(エラーのチェック、バイナリのビルド、その後の実行)を追加します。SandboxToolはコンパイルせず、バックエンドを通じてコードを直接実行します。
バックエンド機能マトリックス
| 機能 | ProcessBackend | WasmBackend | EmbeddedJsExecutor | Monty executors | DockerExecutor |
|---|---|---|---|---|---|
| タイムアウト | 適用 | 適用 | 適用 | 適用(VM 内) | 適用 |
| メモリ制限 | 適用なし | 適用 | 適用なし | 適用 | コンテナの制限 |
| ネットワーク分離 | 強制なし | WASI ネットワークなし | API 使用不可 | API 使用不可 | 設定可能 |
| ファイルシステム分離 | 強制なし | WASI の事前オープンなし | API 使用不可 | 許可されたマウントのみ | 設定可能 |
| 環境分離 | env_clear() | 完全 | API 使用不可 | 許可されたマップのみ | 設定可能 |
| 言語 | Rust、Python、JS、TS、コマンド | Wasm | JavaScript | Python | Python、Node.js |
ProcessBackendは、自身が強制しないことについて正直です。完全なサンドボックス化にはWasmBackendを、コンテナレベルの分離にはDockerExecutorを使用してください。
ツール
| ツール | Crate | 名前 | 言語 | スコープ |
|---|---|---|---|---|
CodeTool | adk-code | code_exec | Rust | code:execute, code:execute:rust |
SandboxTool | adk-sandbox | sandbox_exec | 多言語 | code:execute |
PythonCodeTool | adk-tool | python_code | Python(コンテナベースの CPython) | code:execute、code:execute:container |
MontyPythonCodeTool | adk-tool | monty_python_code | Python(プロセス内 Monty) | code:execute |
CodeTool、SandboxTool、MontyPythonCodeToolは、エラーを情報として扱うパターンに従います。エラーは"status"フィールドを持つ構造化されたJSONとして返され、ToolErrorとして返されることはありません。これにより、エージェントは失敗について推論できます。PythonCodeToolは例外であり、code引数がない場合とエグゼキューター レベルの失敗に対してToolErrorを返します。スクリプト レベルの失敗のみがデータとして表面化します。
インプロセス Python 実行(一回限りの実行および REPL モード、OS アクセス許可、ホスト関数)については、Python コード実行を参照してください。
構造化診断
CodeToolは、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 `;`"
}
成功レスポンスには、ハーネスから抽出された構造化出力が含まれます。
{
"status": "success",
"stdout": "",
"output": { "greeting": "hello" },
"exit_code": 0,
"duration_ms": 42
}
Rust コードの契約
ユーザーコードはfn run(input: serde_json::Value) -> serde_json::Valueを提供する必要があります。ハーネスは、fn main()、標準入力の解析、標準出力のシリアル化でこれをラップします。ユーザーコードではfn main()を定義したり、クレート レベルの属性(#![...])を使用したりしてはなりません。
以前のAPIからの移行
以前のadk-code型(CodeExecutor、ExecutionRequest、RustSandboxExecutor)と、adk-toolのRustCodeToolは削除されました。代わりに新しい型を使用してください。
| 削除対象 | 置換後 | クレート |
|---|---|---|
RustCodeTool(0.8.0 で削除) | CodeTool | adk-code |
RustSandboxExecutor | RustExecutor | adk-code |
ExecutionRequest | ExecRequest | adk-sandbox |
ExecutionResult | ExecResult | adk-sandbox |
CodeExecutor | SandboxBackend | adk-sandbox |
完全な移行ガイドについては、adk_code::compatを参照してください。
ブラウザ JavaScript
adk-browserを介したブラウザページJavaScriptの実行は、独立した機能です。これはリモートページのコンテキスト内で実行され、コード実行基盤の一部ではありません。ウェブの自動化とページ操作にはadk-browserツールを使用してください。
Studioとの統合
ADK Studioは同じコード実行パイプラインを使用します。
- ライブランナー:
RustExecutor+ProcessBackendを介して作成したRustを実行 - コード生成: 同じRust本体を生成されたプロジェクトに埋め込み
- サンドボックス設定: バックエンドで適用可能な機能に対応付けます。