相信大家在使用dify时,常常遇到配置一个智能体解决不够智能,但配置多个智能体又会耗费很多token的场景。
近期我在使用dify配置接口时,就遇到了这个问题,智能体根据问题判断用户意图,得出使用哪个接口还不够,还需要进一步将问题转换为接口所需参数。这个时候就有一个问题:按照工作流的流程去配置,那么每个http接口前需要放一个智能体来获取http的所有参数,再结合问题进一步解析所需参数,那在实际落地使用时就会产生巨额的token。
紧接着我便转换了思路,将接口配置为了自定义工具,将其作为工具提供给智能体,使其可以根据需求,自动决定用哪个工具,从而节省token的同时提高智能度。
但是dify平台在添加自定义工具后,虽然刚添加时还能配合提示词进行调试。但是离开界面后,不管有没有保存,回到该智能体编排界面都会显示黄色感叹号(工具已被移除)。在排除了异步检测接口(在离开界面后,dify里有一个异步检测工具能否使用的逻辑,会自行ping接口的url,如果连接不了,会自动移除工具)的原因后,黄色感叹号依然存在。
在排除了防火墙等通信问题后,终于在数据库的逻辑里发现了盲点:数据库里的工具id是api_provider.id,是一个UUID类型的值,而自定义工具在添加时的provider_id则是字符串类型,在添加自定义工具后,python后端尝试链接两个值时就会永远返回False(即使值相同,但是由于类型不同无法匹配),工具提供商被判定为"找不到",进而系统认为该工具的提供商已不存在,标记为deleted_tools,并在前端显示"工具已被移除"。
解决的办法如下,在终端进入dify目录下api的模型文件夹的路径,依次输入命令:
# 第 1 步:修改源代码
cp ~/dify/api/models/model.py ~/dify/api/models/model.py.backup
sed -i '230s/api_provider\.id/str(api_provider.id) # 转换为字符串以匹配 provider_id 的类型/' ~/dify/api/models/model.py
# 第 2 步:创建 Dockerfile.api-custom
cat > ~/dify/docker/Dockerfile.api-custom << 'EOF'
# API 后端自定义 Dockerfile - 修复 deleted_tools Bug
FROM langgenius/dify-api:1.11.2
# 切换到root用户以获得权限
USER root
# 复制修改后的 model.py(修复 UUID 类型不匹配的 Bug)
COPY api/models/model.py /app/api/models/model.py
# 清除 Python 缓存
RUN find /app/api/models -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
# 切换回原用户
USER dify
EOF
# 第 3 步:构建自定义 API 镜像
cd ~/dify
docker build -f docker/Dockerfile.api-custom -t dify-api-custom:latest .
# 第 4 步:修改 docker-compose-template.yaml
cd ~/dify/docker
cp docker-compose-template.yaml docker-compose-template.yaml.backup
sed -i 's|langgenius/dify-api:1.11.2|dify-api-custom:latest|g' docker-compose-template.yaml
# 第 5 步:重新生成 docker-compose.yaml
./generate_docker_compose
# 第 6 步:重启服务
docker compose down
docker compose up -d
其实就是在匹配id处加上一个str()转换成字符串,并把设置一个自定义镜像就行,这样每次走本地的dify时都会用这个自定义镜像构建容器。