mirror of
https://github.com/langgenius/dify-docs.git
synced 2026-03-27 13:28:32 +07:00
182 lines
7.3 KiB
Plaintext
182 lines
7.3 KiB
Plaintext
---
|
||
title: "代码执行"
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [介绍](#介绍)
|
||
- [使用场景](#使用场景)
|
||
- [本地部署](#本地部署)
|
||
- [安全策略](#安全策略)
|
||
|
||
## 介绍
|
||
|
||
代码节点支持运行 Python / NodeJS 代码以在工作流程中执行数据转换。它可以简化你的工作流程,适用于Arithmetic、JSON transform、文本处理等情景。
|
||
|
||
该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的 Python 或 Javascript 脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码:
|
||
|
||

|
||
|
||
## 配置
|
||
|
||
如果你需要在代码节点中使用其他节点的变量,你需要在`输入变量`中定义变量名,并引用这些变量,可以参考[变量引用](../key-concepts#变量)。
|
||
|
||
## 使用场景
|
||
|
||
使用代码节点,你可以完成以下常见的操作:
|
||
|
||
### 结构化数据处理
|
||
|
||
在工作流中,经常要面对非结构化的数据处理,如 JSON 字符串的解析、提取、转换等。最典型的例子就是 HTTP 节点的数据处理,在常见的 API 返回结构中,数据可能会被嵌套在多层 JSON 对象中,而我们需要提取其中的某些字段。代码节点可以帮助你完成这些操作,下面是一个简单的例子,它从 HTTP 节点返回的 JSON 字符串中提取了`data.name`字段:
|
||
|
||
```python
|
||
def main(http_response: str) -> dict:
|
||
import json
|
||
data = json.loads(http_response)
|
||
return {
|
||
# 注意在输出变量中声明result
|
||
'result': data['data']['name']
|
||
}
|
||
```
|
||
|
||
### 数学计算
|
||
|
||
当工作流中需要进行一些复杂的数学计算时,也可以使用代码节点。例如,计算一个复杂的数学公式,或者对数据进行一些统计分析。下面是一个简单的例子,它计算了一个数组的平方差:
|
||
|
||
```python
|
||
def main(x: list) -> dict:
|
||
return {
|
||
# 注意在输出变量中声明result
|
||
'result' : sum([(i - sum(x) / len(x)) ** 2 for i in x]) / len(x)
|
||
}
|
||
```
|
||
|
||
### 拼接数据
|
||
|
||
有时,也许你需要拼接多个数据源,如多个知识检索、数据搜索、API调用等,代码节点可以帮助你将这些数据源整合在一起。下面是一个简单的例子,它将两个知识库的数据合并在一起:
|
||
|
||
```python
|
||
def main(knowledge1: list, knowledge2: list) -> dict:
|
||
return {
|
||
# 注意在输出变量中声明result
|
||
'result': knowledge1 + knowledge2
|
||
}
|
||
```
|
||
|
||
## 本地部署
|
||
|
||
如果你是本地部署的用户,你需要启动一个沙盒服务,它会确保恶意代码不会被执行,同时,启动该服务需要使用Docker服务,你可以在[这里](https://github.com/langgenius/dify/tree/main/docker/docker-compose.middleware.yaml)找到Sandbox服务的具体信息,你也可以直接通过`docker-compose`启动服务:
|
||
|
||
```bash
|
||
docker-compose -f docker-compose.middleware.yaml up -d
|
||
```
|
||
|
||
> 如果你的系统安装了 Docker Compose V2 而不是 V1,请使用 `docker compose` 而不是 `docker-compose`。通过`$ docker compose version`检查这是否为情况。在[这里](https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command)阅读更多信息。
|
||
|
||
## 安全策略
|
||
|
||
无论是 Python3 还是 Javascript 代码执行器,它们的执行环境都被严格隔离(沙箱化),以确保安全性。这意味着开发者不能使用那些消耗大量系统资源或可能引发安全问题的功能,例如直接访问文件系统、进行网络请求或执行操作系统级别的命令。这些限制保证了代码的安全执行,同时避免了对系统资源的过度消耗。
|
||
|
||
### 高级功能
|
||
|
||
**错误重试**
|
||
|
||
针对节点发生的部分异常情况,通常情况下再次重试运行节点即可解决。开启错误重试功能后,节点将在发生错误的时候按照预设策略进行自动重试。你可以调整最大重试次数和每次重试间隔以设置重试策略。
|
||
|
||
- 最大重试次数为 10 次
|
||
- 最大重试间隔时间为 5000 ms
|
||
|
||

|
||
|
||
**异常处理**
|
||
|
||
代码节点处理信息时有可能会遇到代码执行异常的情况。应用开发者可以参考以下步骤配置异常分支,在节点出现异常时启用应对方案,而避免中断整个流程。
|
||
|
||
1. 在代码节点启用 “异常处理”
|
||
2. 选择异常处理方案并进行配置
|
||
|
||

|
||
|
||
需了解更多应对异常的处理办法,请参考[异常处理](../error-handling/readme)。
|
||
|
||
### 常见问题
|
||
|
||
**在代码节点内填写代码后为什么无法保存?**
|
||
|
||
请检查代码是否包含危险行为。例如:
|
||
|
||
```python
|
||
def main() -> dict:
|
||
return {
|
||
"result": open("/etc/passwd").read(),
|
||
}
|
||
```
|
||
|
||
这段代码包含以下问题:
|
||
|
||
- **未经授权的文件访问:** 代码试图读取 "/etc/passwd" 文件,这是 Unix/Linux 系统中存储用户账户信息的关键系统文件。
|
||
- **敏感信息泄露:** "/etc/passwd" 文件包含系统用户的重要信息,如用户名、用户 ID、组 ID、home 目录路径等。直接访问可能会导致信息泄露。
|
||
|
||
危险代码将会被 Cloudflare WAF 自动拦截,你可以通过 “网页调试工具” 中的 “网络” 查看是否被拦截。
|
||
|
||

|
||
|
||
## 代码修复
|
||
|
||
此功能通过利用上次运行`current_codeerror_message`变量实现自动代码纠正。
|
||
|
||
当代码节点运行失败时:
|
||
|
||
- 系统会捕获代码和错误信息。
|
||
- 这些信息会作为上下文变量传递到提示中。
|
||
- 系统会生成一个新版本的代码供审查和重试。
|
||
|
||
**配置:**
|
||
|
||
1. **编写修复提示:**
|
||
|
||
你可以自定义一个提示,例如:
|
||
|
||
在提示编辑器中,使用变量插入菜单(`/`或`{`)插入变量。
|
||
|
||
`根据以下错误信息修复代码:
|
||
代码:
|
||
{{current_code}}
|
||
错误:
|
||
{{error_message}}`
|
||
|
||

|
||
|
||
2. **使用上下文变量(如果在工作流程后续需要)**
|
||
|
||
要启用自动代码修复,请在提示中引用以下上下文变量:
|
||
|
||
- `{{current_code}}`:此节点上次运行的代码。
|
||
- `{{error_message}}`:如果上次运行失败,则为错误消息。
|
||
|
||
你还可以引用任何前置节点的输出变量。
|
||
|
||
当代码节点运行时,这些变量会自动可用,并允许模型使用先前的运行信息进行迭代修正。
|
||
|
||
3. **版本管理**
|
||
|
||
- 每次修正尝试都会保存为一个单独的版本(例如,版本1、版本2)。
|
||
- 用户可以通过结果显示区域的下拉菜单在不同版本间切换。
|
||
|
||
**注意事项:**
|
||
|
||
- 如果上次运行成功,error_message为空。
|
||
- last_run可用于引用先前的输入/输出。
|
||
|
||
这减少了手动复制粘贴操作,并允许在工作流程中直接进行迭代调试。
|
||
|
||
---
|
||
|
||
{/*
|
||
Contributing Section
|
||
DO NOT edit this section!
|
||
It will be automatically generated by the script.
|
||
*/}
|
||
|
||
[编辑此页面](https://github.com/langgenius/dify-docs/edit/main/zh-hans/guides/workflow/node/code.mdx) | [提交问题](https://github.com/langgenius/dify-docs/issues/new?template=docs.yml)
|