Skip to content
ეს გვერდი შეიქმნა და ითარგმნა ხელოვნური ინტელექტის დახმარებით. თუ შეამჩნევთ უზუსტობას, გთხოვთ, დაგვეხმარეთ გაუმჯობესებაში. GitHub-ზე რედაქტირება

გაშვების გარემოს ბექენდები

PRX მხარს უჭერს მრავალ შესრულების ბექენდს ინსტრუმენტების, ბრძანებებისა და გარე პროცესების გასაშვებად. გაშვების ქვესისტემა აბსტრაჰებს შესრულების გარემოს RuntimeAdapter ტრეიტის უკან, რაც საშუალებას გაძლევთ ლოკალური პროცესის შესრულებას, Docker კონტეინერებსა და WebAssembly სენდბოქსებს შორის გადართვა აგენტის კონფიგურაციის ცვლილების გარეშე.

მიმოხილვა

როდესაც აგენტი ასრულებს ინსტრუმენტს, რომელიც გარე ბრძანების გაშვებას მოითხოვს (shell სკრიპტები, MCP სერვერები, უნარების ინტეგრაციები), გაშვების ბექენდი განსაზღვრავს, როგორ შესრულდება ეს ბრძანება:

ბექენდიიზოლაციაოვერჰედიგამოყენების შემთხვევა
Nativeპროცესის დონემინიმალურიდეველოპმენტი, სანდო გარემოები
Dockerკონტეინერის დონესაშუალოპროდაქშენი, არასანდო ინსტრუმენტები, რეპროდუცირებადობა
WASMსენდბოქსის დონედაბალიპორტატული უნარები, მაქსიმალური იზოლაცია, დანამატის სისტემა
აგენტის ციკლი

    ├── ინსტრუმენტის გამოძახება: "shell" ბრძანებით "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 შეიცავს stdout, stderr, exit_code და duration ველებს.

კონფიგურაცია

აირჩიეთ და კონფიგურირეთ გაშვების ბექენდი config.toml-ში:

toml
[runtime]
# ბექენდის არჩევა: "native" | "docker" | "wasm" | "auto"
backend = "auto"

# გლობალური შესრულების ტაიმაუტი (შეიძლება თითოეული ინსტრუმენტისთვის გადაფარვა).
default_timeout_secs = 60

# stdout/stderr-იდან დაფიქსირებული გამოტანის მაქსიმალური ზომა.
max_output_bytes = 1048576  # 1 MB

# გარემოს ცვლადების თეთრი სია. მხოლოდ ეს ცვლადები
# გადაეცემა შვილ პროცესებს (ყველა ბექენდისთვის).
env_whitelist = ["PATH", "HOME", "TERM", "LANG", "USER"]

ავტოგამოვლენა

backend = "auto"-ისას, PRX ირჩევს გაშვების გარემოს ხელმისაწვდომობის მიხედვით:

  1. თუ Docker მუშაობს და ხელმისაწვდომია, Docker-ის გამოყენება
  2. თუ WASM გაშვების გარემო ხელმისაწვდომია, WASM-ის გამოყენება თავსებადი ინსტრუმენტებისთვის
  3. Native-ზე გადასვლა

ავტოგამოვლენა ერთხელ ეშვება გაშვებისას და ლოგში ჩაწერს არჩეულ ბექენდს.

Native გაშვების გარემო

Native გაშვების გარემო ბრძანებებს ლოკალურ შვილ პროცესებად უშვებს tokio::process::Command-ის გამოყენებით. ეს არის ყველაზე მარტივი და სწრაფი ბექენდი, დამატებითი დამოკიდებულებების გარეშე.

კონფიგურაცია

toml
[runtime]
backend = "native"

[runtime.native]
# shell ბრძანებების შესრულებისთვის.
shell = "/bin/bash"

# დამატებითი გარემოს ცვლადების დაყენება.
[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-2წ არის, გამოსახულებაზე დამოკიდებულებით. ფაილურ სისტემაზე წვდომა შეზღუდულია კონტეინერით და ცალსახად მიერთებული ტომებით.

უსაფრთხოება

Docker გაშვების გარემო ნაგულისხმევად ძლიერ იზოლაციას უზრუნველყოფს: ქსელის იზოლაცია (network = "none"), რესურსების ლიმიტები (მეხსიერება/CPU/PID), მხოლოდ-წაკითხვადი root ფაილური სისტემა, პრივილეგირებული რეჟიმის გარეშე და შესრულების შემდეგ კონტეინერის ავტომატური წაშლა. ინსტრუმენტისთვის სპეციფიკური გამოსახულების გადაფარვა მხარდაჭერილია [runtime.docker.tool_images]-ით.

WASM გაშვების გარემო

WASM (WebAssembly) გაშვების გარემო .wasm მოდულებად კომპილირებულ ინსტრუმენტებს ასრულებს. WASM უზრუნველყოფს პორტატულ, სენდბოქსით იზოლირებულ შესრულებას WASI-ით (WebAssembly System Interface) წვრილმარცვლოვანი შესაძლებლობების კონტროლით.

კონფიგურაცია

toml
[runtime]
backend = "wasm"

[runtime.wasm]
# WASM გაშვების ძრავა: "wasmtime" | "wasmer"
engine = "wasmtime"

# .wasm მოდულების შემცველი დირექტორია.
module_path = "~/.local/share/openprx/wasm/"

# WASM მოდულებისთვის მინიჭებული WASI შესაძლებლობები.
[runtime.wasm.capabilities]
filesystem_read = ["/workspace"]
filesystem_write = ["/tmp"]
network = false
env_vars = ["HOME", "USER"]

# ერთი WASM გამოძახების მაქსიმალური შესრულების დრო.
timeout_secs = 30

# WASM მოდულებისთვის მაქსიმალური მეხსიერების გამოყოფა.
max_memory_mb = 128

მახასიათებლები

თვისებამნიშვნელობა
იზოლაციაWASM სენდბოქსი (შესაძლებლობებზე დაფუძნებული)
გაშვების დრო10-50ms
ფაილურ სისტემაზე წვდომამხოლოდ WASI-ით წინასწარ გახსნილი დირექტორიები
ქსელზე წვდომაკონფიგურირებადი WASI-ით
დამოკიდებულებებიwasmtime ან wasmer გაშვების გარემო (პირობითი კომპილაცია)
პლატფორმაყველა (WASM პლატფორმისგან დამოუკიდებელია)

პირობითი კომპილაცია

WASM გაშვების გარემო პირობითად კომპილირდება ფუნქციის ფლაგის უკან:

bash
# PRX-ის აშენება WASM მხარდაჭერით
cargo build --release --features wasm-runtime

ფუნქციის ფლაგის გარეშე, WASM ბექენდი ხელმისაწვდომი არ არის და backend = "auto" მას გამოტოვებს.

დანამატის სისტემა

WASM გაშვების გარემო PRX-ის დანამატის სისტემას აძლიერებს. .wasm მოდულებად გავრცელებული უნარები დინამიურად იტვირთება მშობლიური კოდის ნდობის გარეშე. დაარეგისტრირეთ WASM ინსტრუმენტები config.toml-ში [tools.custom.<name>]-ის ქვეშ type = "wasm" და module ბილიკით.

ქარხნის ფუნქცია

PRX ქარხნის ფუნქციას (create_runtime) იყენებს ბექენდის გაშვებისას ასარჩევად. იგი კონფიგურირებულ backend სტრიქონს შესაბამის RuntimeAdapter იმპლემენტაციასთან ათანხმებს და ამოწმებს, რომ ბექენდი ხელმისაწვდომია (მაგ., Docker-ის დემონი მუშაობს, WASM ძრავა კომპილირებულია).

შედარების მატრიცა

ფუნქციაNativeDockerWASM
დაყენების სირთულეარცერთიDocker-ის დემონიფუნქციის ფლაგი + მოდულები
გაშვების შეყოვნება< 10ms500ms - 2წ10-50ms
იზოლაციის სიძლიერედაბალიმაღალიმაღალი
რესურსების კონტროლიOS-ის ლიმიტებიcgroupsWASM მეხსიერების ლიმიტები
ქსელის იზოლაციასენდბოქსითჩაშენებულიWASI შესაძლებლობა
ფაილური სისტემის იზოლაციასენდბოქსითჩაშენებულიWASI წინასწარ გახსნები
პორტატულობაპლატფორმისთვის მშობლიურიOCI გამოსახულებებიპლატფორმისგან დამოუკიდებელი
ინსტრუმენტების თავსებადობაყველაყველა (გამოსახულებით)მხოლოდ WASM-ში კომპილირებული

უსაფრთხოების შენიშვნები

  • გაშვების ბექენდი არის თავდაცვის ფენა, არა სენდბოქსის ჩანაცვლება. ორივე სისტემა ერთად მუშაობს -- გაშვების გარემო უზრუნველყოფს შესრულების გარემოს, სენდბოქსი ამატებს OS-ის დონის შეზღუდვებს.
  • Docker გაშვების გარემო მოითხოვს Docker-ის სოკეტზე წვდომას, რაც თავისთავად პრივილეგირებული რესურსია. გაუშვით PRX გამოყოფილი სერვისის ანგარიშით.
  • WASM მოდულებს არ აქვთ ნაგულისხმევი უფლებამოსილება. ყველა შესაძლებლობა (ფაილური სისტემა, ქსელი, გარემო) ცალსახად უნდა მიენიჭოს.
  • env_whitelist პარამეტრი ყველა ბექენდზე ვრცელდება. API გასაღებები და საიდუმლოებები არასოდეს გადაეცემა ინსტრუმენტის შესრულების გარემოებს.

დაკავშირებული გვერდები

Released under the Apache-2.0 License.