零基础代码,也能在dify中创建自定义工具?手把手教你!
1 什么是dify
Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务(Backend as Service, BaaS)和LLMOps的理念,使开发者能够快速搭建生产级的AI应用。
Dify的核心功能包括:
- 低代码/无代码开发:Dify提供了一个用户友好的界面,通过可视化的方式允许开发者轻松定义Prompt、上下文和插件等,无需深入底层技术细节。
- 模块化设计:采用模块化的设计,每个模块都有清晰的功能和接口,可以根据需求选择性地使用。
- 丰富的功能组件:包括AI工作流、RAG管道、Agent、模型管理、可观测性功能等,帮助开发者从原型到生产的全过程。
- 支持多种大语言模型:已支持OpenAI GPT系列等模型,并计划进一步扩展。
- 数据处理和特征工程工具:提供了数据清洗、特征选择、特征变换等功能,帮助开发者更好地准备数据。
- 集成外部知识源:允许自定义API接入外部知识源,让大型语言模型深入理解企业知识和业务。
此外,Dify还具有以下特点:
- 面向各种技术背景的开发者:即使是没有编程基础的用户也能快速上手并参与到AI应用的定义和数据运营过程中。
- 开源和社区支持:作为一个开源项目,Dify在GitHub上有活跃的社区支持,鼓励用户贡献和分享经验。
dify本身集成第三方工具和工作流。

目前我们系统通过自定义工具来和LLM 和ai agent进行整合,那么这个如何实现呢?下面给大家介绍一下如何实现自定义工具。
2.创建自定义工具
2.1 OpenAPI-Swagger规范
dify提供了创建自定义工具,不过这个自定义工具是需要遵循OpenAPI-Swagger规范。
规范的空模版的例子如下
{
"openapi": "3.1.0",
"info": {
"title": "Untitled",
"description": "Your OpenAPI specification",
"version": "v1.0.0"
},
"servers": [
{
"url": ""
}
],
"paths": {},
"components": {
"schemas": {}
}
}这里面我们会遇到2个问题,如何编写第三方接口以及如何符合这个第三方规范来实现这个自定义工具呢?下面我们来介绍一下这块。
2.2 用deepseek 代码助手写代码
1.登录
https://chat.deepseek.com/coder
首先我们需要写一个第三方接口。这个我们为了简单起见,我们使用python fastapi写一个城市天气接口
from fastapi import FastAPI, Request, HTTPException
import random
app = FastAPI()
@app.post('/weather')
async def get_weather(request: Request):
auth_header = request.headers.get('Authorization')
if auth_header != 'Bearer zhouhui':
raise HTTPException(status_code=403, detail="Invalid Authorization header")
request_data = await request.json()
city = request_data.get('city', None)
if city is None:
return {
'status': 'error',
'errorInfo': 'No city provided',
'data': None
}
# 随机生成温度,风速和风向
temperature = f'{random.randint(10, 20)}'
windspeed = f'{random.randint(1, 5)}级'
winddirect = random.choice(['北风', '南风', '西风', '东风']) # 随机选择风向
# 返回对LLM友好的字符串格式的响应
return f"{city}今天是晴天,温度{temperature}, 风速{windspeed}, 风向{winddirect}"
import uvicorn
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8081)2.3生成curl 命令行代码
我们将写好的代码使用postman 测试一下。我让GPT 帮我生成 curl 请求代码
我给GPT的问题:以上代码我需要使用postman 测试,请将以上代码使用CURL 命令实现客户端测试,请给出代码

2.4 导入postman
好了,我们拿到他生成的curl 命令行代码,导入postman中
curl -X POST "http://localhost:8081/weather" \
-H "Authorization: Bearer zhouhui" \
-H "Content-Type: application/json" \
-d '{"city": "北京"}'
2.5 启动第三方接口服务
我们将刚才GPT生成的 获取天气的fastapi 接口代码 在本地环境中运行起来。(这里需要本地环境中安装好python运行环境)

cmd命令行窗口中切换到当前目录下运行
python tianqi2.py
以上步骤完成第三方自定义接口服务端部署工作。
2.6 测试接口
我们接下来,使用postman测试一下这个 获取天气的fastapi 接口代码。点击postman "send" 按钮


以上步骤说明GPT 生成的代码验证测试是没有问题的,后面是可以使用的。
2.7 生成OpenAPI-Swagger规范
因为我们上面提到2个问题第一个问题是编写第三方服务接口代码,这个问题已经完成。第二个问题如何将这个服务接口代码转换成符合OpenAPI-Swagger规范代码。我们同样利用GPT 帮我干这个事情。
把curl命令转为openapi schema,提示词如下
请把curl请求命令转成openapi 3.1.0 版本的json schema,不需要包含response信息
<curl>
curl -X POST "http://localhost:8081/weather" \
-H "Authorization: Bearer zhouhui" \
-H "Content-Type: application/json" \
-d '{"city": "北京"}'
</curl>
json schema请参照下面的例子
<json-schema>
{
"openapi": "3.1.0",
"info": {
"title": "Get weather data",
"description": "Retrieves current weather data for a location.",
"version": "v1.0.0"
},
"servers": [
{
"url": ""
}
],
"paths": {},
"components": {
"schemas": {}
}
}
</json-schema>
生成的结果如下
{
"openapi": "3.1.0",
"info": {
"title": "Weather API",
"description": "Retrieves weather data for a location.",
"version": "v1.0.0"
},
"servers": [
{
"url": "http://localhost:8081"
}
],
"paths": {
"/weather": {
"post": {
"summary": "Retrieves weather data for a location.",
"description": "Retrieves weather data for a location.",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": ["city"]
}
}
}
},
"responses": {
"200": {
"description": "Weather data retrieved successfully."
}
}
}
}
},
"components": {
"schemas": {}
}
}
deepseek 代码助手 非常听话就按照我提示词要求写好符合要求的OpenAPI-Swagger规范代码。
2.8 验证测试自定义第三方接口
接下来我们验证一下,将以上生成好的代码复制到dify 创建自定义工具中

填写 名称和 schema

我们先不着急保存,点击可用工具栏最后边测试按钮进行测试。
鉴权方法中我们点击设置

选择API KEY ,选择 bearer,填写第三方接口鉴权密码 zhouhui

在弹出测试对话框中输入 测试内容,点击测试按钮



以上步骤验证通过,说明我们自定义第三方接口也是OK的了,点击保存按钮完成设置。
点击保存

我们完成第三方自定义接口dify配置

3 .创建工作流应用
工作室页面->创建空白应用->选择聊天助手->选择工作流编排->输入名称,工具调用-工作流(获取天气)


进入工作流配置界面
3.1 开始
这里我们不需要修改其他东西,因为我们接下来需要有个判断,所以需要配置问题分类器。开始节点配置如下

我们选中开始节点,点击左下角“添加节点”-选中‘’问题分类器“


以上步骤我们完成开始节点-问题分类器配置。
3.2 问题分类器
在问题分类器中,我们在模型列表中选择一个可以使用的模型。

分类1和分类2中我们填写如下内容
分类 1
查询天气
分类 2
其他
以上完成问题分类器的设置,设置如下

3.3模型处理
因为上面分类器有2个节点,所以我们需要设置2个不同的模型来处理不同的问题。
我们为了区别前面问题分类器模型,选择另外的模型如:zhipuai/glm4-9b-chat模型

2个模型分别设置不同的系统提示词。
上面的模型设置及提示词如下:
你是天气预报按口参效提取助手,你能够提取出用户要查询天
气的城市参数,请直接输出要查询天气的城市名称,不要输出
其他额外信息。
第二个模型由于不做处理。所以设置如下
我不知道
3.4第三方自定义工具
接下来我们需要将处理天气LLM连接到上面创建好的自定义工具中。


这个第三方接口输入参数比较简单,设置如下


3.5 函数处理LLM配置
接下来我们在将第三方自定义工具处理结果接入一个LLM 来实现推理。配置和上面类似
系统提示词如下
请根据下面天气信息回答问题
天气信息:
"""
{{#1721354989471.text#}}
"""
问题:{{#sys.query#}}
最后在模型后面拖入一个回复节点介绍本次工作流配置,完整的流程图如下。

以上设置完成后,我们点击发布

3.6 工作流中调用工具测试
点击“调试和预览”

输入一下信息 :北京天气

我们点开工作流查看它调用过程

我们展开可以看到它调用过程

同样工作流也触发了我们第三方工具

如果问题和天气无关的东西,也返回信息如下


可以看出如果问题的问题和天气无关他就会转到下面的工作流中。
4 .总结
dify是非常强大的开源AI agent智能体,尤其是工作流的出现,这样我们很多功能都可以利用工作流+第三方插件来实现各种业务场景了。
本次我们只演示第三方工具在工作流应用,第三方工具配合AI agent也是可以使用的。(这里需要模型支持函数调用 function call功能)
本次就给大家分享这些,下一个案例我们在介绍使用dify实现企业基本信息的调用。整合数据库查询。