Skip to content
このページは AI の支援により作成・翻訳されました。誤りがあれば、改善にご協力ください。 GitHub で編集

ランタイムバックエンド

PRX はツール、コマンド、外部プロセスの実行に複数の実行バックエンドをサポートします。ランタイムサブシステムは RuntimeAdapter トレイトの背後に実行環境を抽象化し、エージェント設定を変更することなくローカルプロセス実行、Docker コンテナ、WebAssembly サンドボックスを切り替えることができます。

概要

エージェントが外部コマンドの実行を必要とするツール(シェルスクリプト、MCP サーバー、スキル統合)を実行する場合、ランタイムバックエンドがそのコマンドの実行方法を決定します:

バックエンド分離レベルオーバーヘッドユースケース
Nativeプロセスレベル最小開発、信頼された環境
Dockerコンテナレベル中程度本番、信頼されていないツール、再現性
WASMサンドボックスレベルポータブルスキル、最大の分離、プラグインシステム
Agent Loop

    ├── Tool Call: "shell" with command "ls -la"


┌───────────────────────────────────┐
│         RuntimeAdapter            │
│  ┌─────────┬─────────┬─────────┐ │
│  │ Native  │ Docker  │  WASM   │ │
│  │ Runtime │ Runtime │ Runtime │ │
│  └────┬────┴────┬────┴────┬────┘ │
└───────┼─────────┼─────────┼──────┘
        │         │         │
   ┌────▼────┐ ┌──▼───┐ ┌──▼────┐
   │ Process │ │ ctr  │ │ wasmr │
   │ spawn   │ │ exec │ │ exec  │
   └─────────┘ └──────┘ └───────┘

RuntimeAdapter トレイト

すべてのバックエンドは RuntimeAdapter トレイトを実装します:

rust
#[async_trait]
pub trait RuntimeAdapter: Send + Sync {
    async fn execute(&self, command: &str, args: &[String],
        env: &HashMap<String, String>, working_dir: Option<&Path>,
        timeout: Duration) -> Result<ExecutionOutput>;
    async fn is_available(&self) -> bool;
    fn name(&self) -> &str;
}

ExecutionOutput には stdoutstderrexit_codeduration が含まれます。

設定

config.toml でランタイムバックエンドを選択・設定します:

toml
[runtime]
# Backend selection: "native" | "docker" | "wasm" | "auto"
backend = "auto"

# Global execution timeout (can be overridden per-tool).
default_timeout_secs = 60

# Maximum output size captured from stdout/stderr.
max_output_bytes = 1048576  # 1 MB

# Environment variable whitelist. Only these variables are
# passed to child processes (all backends).
env_whitelist = ["PATH", "HOME", "TERM", "LANG", "USER"]

自動検出

backend = "auto" の場合、PRX は利用可能性に基づいてランタイムを選択します:

  1. Docker が実行中でアクセス可能な場合、Docker を使用
  2. WASM ランタイムが利用可能な場合、互換ツールに WASM を使用
  3. Native にフォールバック

自動検出は起動時に 1 回実行され、選択されたバックエンドがログに記録されます。

Native ランタイム

Native ランタイムは tokio::process::Command を使用してローカル子プロセスとしてコマンドをスポーンします。最もシンプルで高速なバックエンドで、追加の依存関係はありません。

設定

toml
[runtime]
backend = "native"

[runtime.native]
# Shell to use for command execution.
shell = "/bin/bash"

# Additional environment variables to set.
[runtime.native.env]
RUSTFLAGS = "-D warnings"

特性

プロパティ
分離プロセスレベルのみ(ユーザー権限を継承)
起動時間< 10ms
ファイルシステムアクセスフル(ユーザー権限とサンドボックスにより制限)
ネットワークアクセスフル(サンドボックスにより制限)
依存関係なし
プラットフォームすべて(Linux、macOS、Windows)

セキュリティの考慮事項

Native ランタイムは標準的な Unix プロセス境界を超える分離を提供しません。コマンドは PRX プロセスと同じ権限で実行されます。信頼されていないコマンドを実行する場合は、常に サンドボックスサブシステム と組み合わせてください:

toml
[runtime]
backend = "native"

[security.sandbox]
backend = "bubblewrap"
allow_network = false
writable_paths = ["/tmp"]

Docker ランタイム

Docker ランタイムはエフェメラルコンテナ内でコマンドを実行します。各実行で新しいコンテナを作成し、コマンドを実行し、出力をキャプチャし、コンテナを破棄します。

設定

toml
[runtime]
backend = "docker"

[runtime.docker]
image = "debian:bookworm-slim"
socket = "/var/run/docker.sock"
memory_limit = "256m"
cpu_limit = "1.0"
pids_limit = 100
network = "none"          # "none" | "bridge" | "host"
mount_workspace = true
workspace_mount_path = "/workspace"
auto_pull = true
auto_remove = true

起動時間はイメージによって 500ms-2s です。ファイルシステムアクセスはコンテナと明示的にマウントされたボリュームに制限されます。

セキュリティ

Docker ランタイムはデフォルトで強力な分離を提供します: ネットワーク分離(network = "none")、リソース制限(メモリ/CPU/PID)、読み取り専用ルートファイルシステム、特権モードなし、実行後の自動コンテナ削除。[runtime.docker.tool_images] でツールごとのイメージオーバーライドがサポートされています。

WASM ランタイム

WASM(WebAssembly)ランタイムは .wasm モジュールにコンパイルされたツールを実行します。WASM は WASI(WebAssembly System Interface)による細かい粒度のケーパビリティ制御で、ポータブルかつサンドボックス化された実行を提供します。

設定

toml
[runtime]
backend = "wasm"

[runtime.wasm]
# WASM runtime engine: "wasmtime" | "wasmer"
engine = "wasmtime"

# Directory containing .wasm modules.
module_path = "~/.local/share/openprx/wasm/"

# WASI capabilities granted to WASM modules.
[runtime.wasm.capabilities]
filesystem_read = ["/workspace"]
filesystem_write = ["/tmp"]
network = false
env_vars = ["HOME", "USER"]

# Maximum execution time for a single WASM call.
timeout_secs = 30

# Maximum memory allocation for WASM modules.
max_memory_mb = 128

特性

プロパティ
分離WASM サンドボックス(ケーパビリティベース)
起動時間10-50ms
ファイルシステムアクセスWASI プレオープンディレクトリのみ
ネットワークアクセスWASI 経由で設定可能
依存関係wasmtime または wasmer ランタイム(条件付きコンパイル)
プラットフォームすべて(WASM はプラットフォーム非依存)

条件付きコンパイル

WASM ランタイムはフィーチャーフラグの背後で条件付きコンパイルされます:

bash
# WASM サポート付きで PRX をビルド
cargo build --release --features wasm-runtime

フィーチャーフラグなしでは WASM バックエンドは利用できず、backend = "auto" はこれをスキップします。

プラグインシステム

WASM ランタイムは PRX のプラグインシステムを支えています。.wasm モジュールとして配布されるスキルは、ネイティブコードを信頼することなく動的にロードできます。config.toml[tools.custom.<name>]type = "wasm"module パスで WASM ツールを登録します。

ファクトリ関数

PRX はファクトリ関数(create_runtime)を使用して起動時にバックエンドを選択します。設定された backend 文字列を適切な RuntimeAdapter 実装にマッチさせ、バックエンドが利用可能であることを検証します(例: Docker デーモンの実行、WASM エンジンのコンパイル)。

比較マトリックス

機能NativeDockerWASM
セットアップ複雑度なしDocker デーモンフィーチャーフラグ + モジュール
起動レイテンシ< 10ms500ms - 2s10-50ms
分離強度
リソース制御OS 制限cgroupsWASM メモリ制限
ネットワーク分離サンドボックス経由組み込みWASI ケーパビリティ
ファイルシステム分離サンドボックス経由組み込みWASI プレオープン
ポータビリティプラットフォームネイティブOCI イメージプラットフォーム非依存
ツール互換性すべてすべて(イメージあり)WASM コンパイル済みのみ

セキュリティノート

  • ランタイムバックエンドは防御レイヤーであり、サンドボックスの代替ではありません。両方のシステムが連携して動作します -- ランタイムは実行環境を提供し、サンドボックスは OS レベルの制限を追加します。
  • Docker ランタイムは Docker ソケットへのアクセスが必要で、これ自体が特権リソースです。PRX は専用のサービスアカウントで実行してください。
  • WASM モジュールにはアンビエント権限がありません。すべてのケーパビリティ(ファイルシステム、ネットワーク、環境)は明示的に付与する必要があります。
  • env_whitelist 設定はすべてのバックエンドに適用されます。API キーとシークレットはツール実行環境に渡されません。

関連ページ

Released under the Apache-2.0 License.