前言
为了增加 Agent 框架的扩展性和适用性,我们需要能够在流程节点中安全、高效地运行 Python 脚本。Python 作为 AI 领域的事实标准语言,拥有庞大的生态库,是构建智能体不可或缺的工具。
技术选型思考
1. 为什么选择 Python?
尽管从性能角度看,Lua 等脚本语言更为轻快,但在实际工程落地中,Python 占据了绝对主导地位。其丰富的机器学习、数据处理库(如 NumPy, Pandas, PyTorch)是其他语言难以替代的。虽然未来可能会考虑支持 JavaScript 或 WebAssembly,但现阶段 Python 是必须支持的核心能力。
2. 沙盒环境的必要性
直接在业务 Pod 内部执行 Python 脚本存在巨大风险:
- 环境一致性:不同服务器本地环境差异会导致脚本运行失败。
- 安全性:防止恶意脚本访问宿主机文件系统、网络资源或消耗过多系统资源。
- 隔离性:避免脚本崩溃影响主服务进程。
因此,必须构建一个独立的沙盒运行环境,通过容器化技术实现资源隔离和权限控制。
架构设计
整体架构采用 Rust 作为核心运行时,通过 PyO3 绑定 Python 解释器,对外提供 gRPC 接口。客户端发送请求,Rust 服务解析参数,在沙盒内调用 Python 函数,并将结果序列化返回。
[Client] --(gRPC)--> [Rust Runtime Service] --(PyO3)--> [Python VM]
|
(Docker Container)
核心实现
1. PyO3 绑定与运行时封装
使用 pyo3 库完成 Rust 与 Python 的交互。Python 入口必须是一个可导出的函数,支持指定 sys.path 以加载外部文件。
关键代码逻辑如下:
pub fn eval_function(&self, function_name: &str, args: Value) -> PyResult<Value> {
wd_log::log_debug_ln!("eval_function -> {:?} args:{:?}", self, args);
let Self { src, module_name, file_name, sys_path } = self;
let file_name = file_name.clone().unwrap_or(format!("{}.py", module_name));
Python::with_gil( |py| {
(path) = sys_path {
: &PyList = py.()?.()?.()?;
syspath.(, &path)?;
}
= src {
ScriptSrc::(script) => PyModule::(
py,
script.(),
file_name.(),
module_name.(),
)?,
ScriptSrc::ModuleName => PyModule::(py, module_name.())?,
};
= module.(function_name)?;
= ::(py, args)?;
= FunctionInput { data: input_obj };
= function.((input_class,), )?.extract::<PyObject>()?;
= ::(output_obj, py)?;
(value)
})
}


