告诉我可以在插件中使用的Python库有哪些

我正在尝试实现一个使用 DuckDB 在文本数据上执行 SQL 查询(SELECT 语句)的工具/插件。
当我在本地环境中运行 python -m main 以调试插件时,能够成功运行查询工具,如附图所示。

G6j7evubwAM0gEe

然而,当我将此插件打包并上传/安装到我的本地 OSS 版本或 https://cloud.dify.ai/ 上时,工作流在 DuckDB 节点处理约五分钟之后就会终止。

我怀疑 DuckDB 的大二进制文件大小以及类似因素可能影响了我所遇到的问题。
您能否告诉我关于在工具/插件(沙箱)中可以使用的 Python 库的限制?

在我们的云版本中,由于安全考虑,大多数库默认情况下未安装,数据库连接和HTTP连接等操作也默认被禁用,请注意我们正在使用默认的ssrf_proxy模板。

1 个赞

感谢您的评论。
我的理解是否正确:云版本对可以使用的 Python 库存在限制,而插件无法绕过这些限制?

如果我需要构建一个使用插件中不可用的库的工作流,那么最佳实践是否是通过在 Dify 外部实现基于 API 的扩展(例如使用 Cloudflare Workers)来替代使用插件?

在自托管(非云)版本的 Dify 中,是否可以通过修改 ssrf_proxy 设置或其他配置更改来避免这些限制?

我的理解是否正确,即云版本对可以使用的 Python 库有限制,且插件无法绕过这些限制?

我们不会在云版本中限制特定的库,这些限制是在 squid.conf 中配置的,而在运行器(即 AWS Lambda 容器)中,也可能存在其自身的限制。

如果我需要构建一个使用插件无法使用的库的工作流,那么最好是在 Dify 之外通过 API 扩展(例如使用 Cloudflare Workers)来实现,而不是使用插件吗?

很遗憾,是的。

在自托管(非云)版本的 Dify 中,是否可以通过修改 ssrf_proxy 设置或其他配置更改来避免这些限制?

是的,大多数库需要特定的端口来连接其他服务,如数据库、Elasticsearch 等。

感谢您的评论。

DuckDB(https://duckdb.org/)只是一个用于执行查询(SELECT 语句)的引擎,因此它不需要连接任何外部服务,也不需要通过特定端口进行通信。

我已经确认可以在 AWS Lambda 中使用 https://duckdb.org/docs/stable/clients/python/overview 执行查询,所以我怀疑这可能是 Dify 的沙箱环境中的特定问题。

例如,是否存在某些限制,比如无法使用像 pandas 这样的大型库?

1 个赞

关于沙箱,您可以阅读上面的文档。

  1. 沙箱已添加的系统调用为:0,1,3,8,9,10,11,12,13,14,15,16,16,24,25,35,39,60,96,102,105,106,110,131,186,201,202,217,228,230,231,233,234,257,262,270,273,291,318,334。您需要对比上一步中额外的系统调用编号。您可以使用简单的脚本或询问LLM来实现这一点。在这种情况下,额外的系统调用编号为 5, 17, 28, 63, 204, 237, 281, 435
1 个赞

谢谢。
没有出现诸如“xxx.so: 无法打开共享对象文件:没有那个文件或目录”或“操作不允许”之类的错误;它只是等待五分钟然后退出,因此我不确定它是否真的违反了任何系统调用限制。

不过,由于问题只在打包后出现——调试运行正常,但打包版本会让我等待五分钟——我会检查是否可能存在其他原因。

也许这与 PLUGIN_MAX_EXECUTION_TIMEOUT 有关,但它的设置值是 600。我不确定在我们的云环境中这个值是否合适,但如果你无法在规定时间内获取结果,那么该设置可能会终止执行。