use langchainrust::tools::sandbox::{CodeSandbox, Language, LocalSandbox, SandboxTool};
use langchainrust::BaseTool;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let sandbox = LocalSandbox::new();
println!("=== 执行 Python ===");
let result = sandbox
.run("print(2 + 2)", Language::Python, 10_000)
.await?;
println!("stdout: {}", result.stdout.trim());
println!("exit_code: {}", result.exit_code);
println!("耗时: {}ms", result.execution_time_ms);
println!("\n=== 执行 JavaScript ===");
let result = sandbox
.run(
"console.log(Math.floor(Math.PI * 100))",
Language::JavaScript,
10_000,
)
.await?;
println!("stdout: {}", result.stdout.trim());
println!("\n=== 超时测试 ===");
let result = sandbox
.run("import time; time.sleep(30)", Language::Python, 3_000)
.await;
match result {
Err(e) => println!("预期超时: {}", e),
Ok(r) => println!("意外成功: {:?}", r),
}
println!("\n=== 危险 import 拦截 ===");
let result = sandbox
.run("import os; print(os.getcwd())", Language::Python, 10_000)
.await;
match result {
Err(e) => println!("预期拦截: {}", e),
Ok(r) => println!("意外成功: {:?}", r),
}
println!("\n=== 作为 Agent 工具 ===");
let tool = SandboxTool::new(LocalSandbox::new(), Language::Python).with_timeout(10_000);
let input = r#"{"code": "import json\nprint(json.dumps({'result': 42}))"}"#;
let output = tool.run(input.to_string()).await?;
println!("工具输出: {}", output);
Ok(())
}