Dify是一个现在很受欢迎的智能体工具,在编排智能体工作流的时候,我们经常要用到代码节点,通过代码来完成一些工作。代码节点是在Dify的沙盒中运行的,其用途是在保证系统安全的前提下允许用户执行代码。但是有时代码节点我们需要引入三方库,或者需要对用户上传的文件进行处理,然后保存数据,默认的沙盒环境是不允许我们在代码节点进行这些操作的。这时候我们就需要对沙盒环境进行修改。

安装三方库

Dify的沙盒支持Node.js和Python两种语言,对于Python语言,其只含基础库。如果我们需要安装额外的三方库,可以在dify的docker/sandbox/dependancies目录下,对python-requirements.txt进行修改,例如我需要引入numpy和opencv库,在文件中添加

opencv-python-headless==4.11.0.86
numpy==2.2.6

在sandbox/conf/config.yaml文件里面,我们可以添加pip国内源,增加一个配置

python_pip_mirror_url: https://pypi.tuna.tsinghua.edu.cn/simple

在docker的.env文件里面,也同步增加pip源

PIP_MIRROR_URL=https://pypi.tuna.tsinghua.edu.cn/simple

修改沙盒运行权限

我们直接在沙盒里面引入刚才增加的三方库,会报错operation not permited. 这是因为通过其采用了Linux内核的Seccomp机制,采用​白名单策略​仅允许必要的系统调用(如基础文件操作、内存管理),拦截高危操作(如进程创建、网络访问)。如果我们需要对沙盒环境的文件系统做文件读取写入,进行网络访问或引入第三方库这些操作,需要对权限进行修改。在sandbox/conf/config.yaml里面,设置allowed_syscalls,如以下设置

allowed_syscalls: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,28,30,31,32,33,34,35,36,37,39,56,57,60,61,62,63,72,73,80,81,85,86,90,91,105,106,131,186,202,204,217,231,233,234,237,257,262,273,281,291,318,334,435,499,318,334,307,262,16,8,217,1,3,257,0,202,9,12,10,11,15,25,105,106,102,39,110,186,60,231,234,13,16,24,273,274,334,228,96,35,291,233,230,270,201,14,131,318,56,258,83,41,42,49,50,43,44,45,51,47,52,54,271,63,46,307,55,5,72,138,7,281]

获取用户上传文件

在代码节点中,有时需要获取用户上传的文件并进行一些处理,例如我需要对用户上传的视频文件进行处理,那么我们可以通过文件的URL来进行操作。

对于我在docker环境启动Dify来说,可以通过http://api:5001来获取文件。在docker的docker-compose.yaml文件中可以看到,api和sandbox这两个service的networks都是ssrf_proxy_network,因此在沙盒里面是可以直接访问api的服务的。在.env文件中,设置FILES_URL

FILES_URL=http://api:5001

在代码节点中,我们只要获取上传文件的URL,即可下载文件到沙盒环境中,如以下代码

import requests

def main(arg1: str) -> dict:
    response = requests.get(arg1)
    response.raise_for_status()

    content = response.content
    ...

访问文件系统

在代码节点,有时需要把处理后的数据写到文件系统。沙盒采用了文件系统隔离的方式,使用chroot将代码执行环境限制在临时目录,防止访问宿主机敏感文件。我们可以把宿主机的一个目录映射到沙盒的临时目录下面来进行操作。在docker-compose.yaml里面,在sandbox的volumes增加一个配置,如下:

    volumes:
      - ./volumes/sandbox/dependencies:/dependencies
      - ./volumes/sandbox/conf:/conf
      - ./volumes/sandbox/temp:/var/sandbox/sandbox-python/tmp/temp:rw

然后在代码节点就可以把数据写入到/tmp/temp目录下了。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐