环境:dify 14.2 docker版本;
模型:glm-4-flash;
工具:sql_save_post;
一、背景
Dify 的工作流模式能够为我们带来诸多便利。然而,若要将其运用于生产力领域,使其从玩具转变为工具,仍有许多工作需要完成。例如,将通过 Dify 工作流生成的内容自动写入数据库。
二、实现思路
我们以向 MySQL 数据库写入工作流生成内容为例。采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。在 Dify 上创建自定义工具,并在后续的工作流中调用此工具,以实现生成的内容自动写入 MySQL 数据库。
此外,还有一种方法,通过 Dify 自带的 HTTP 请求工具发送 POST 请求接口。但是,在实际使用过程中,我发现当生成一些特殊字符时,会出现请求失败的情况。而自定义工具的形式则更加稳定。因此,建议大家采用自定义工具的方式。
三、实现步骤
-
编写服务sql_save_post:该服务接收3个参数,日期,正文和类型,其中,通过类型可以区分写入不同的表中,需要提前创建好相关的表,指定端口20016:
新增sql_save_post.py文件
from flask import Flask, request import mysql.connector app = Flask(__name__) # 配置数据库连接信息,根据实际情况修改 config = { "host": "192.168.3.1", # 替换为实际的数据库主机地址 "port": "3306", "user": "user", # 替换为实际的数据库用户名 "password": "password", # 替换为实际的数据库密码 "charset": "utf8", "database": "database" # 指定要连接的数据库名称为database } @app.route('/sql_save', methods=['POST']) def save_data(): """ 接收POST请求中的日期、正文以及类型数据,并根据类型将其存入对应的数据库表中。 """ try: # 获取POST请求中的JSON数据 data = request.get_json() date = data.get('date') text = data.get('text') news_type = data.get('type') # 连接数据库 conn = mysql.connector.connect(**config) cursor = conn.cursor() # 根据不同的类型,确定要插入数据的表名及对应的SQL语句 if news_type == "type1": table_name = "data1" elif news_type == "type2": table_name = "data2" else: return {"message": "不支持的类型"}, 200 sql = f"INSERT INTO {table_name} (date, text) VALUES (%s, %s)" values = (date, text) # 执行SQL语句插入数据 cursor.execute(sql, values) conn.commit() cursor.close() conn.close() return {"message": "数据保存成功"}, 200 except Exception as e: return {"message": f"数据保存失败,原因: {str(e)}"}, 200 if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=20016)
-
启动sql_save_post服务:
python sql_save_post.py
-
编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。输入schema:
openapi: 3.0.0 info: title: 数据保存接口 description: 用于接收POST请求中的日期、正文以及类型数据,并根据类型将其存入对应的数据库表中 version: "1.0.0" servers: - url: 'http://192.168.3.1:20016' description: 本地开发服务器 paths: /sql_save: post: summary: 保存数据到数据库 description: 根据传入的类型,将日期和正文数据存入指定的数据库表 requestBody: required: true content: application/json: schema: type: object properties: date: type: string format: date description: 日期 text: type: string description: 正文 type: type: string enum: [type1, type2] description: 数据类型,用于确定存入的数据库表 required: - date - text - type responses: '200': description: 请求成功 content: application/json: schema: type: object properties: message: type: string description: 响应消息,如"数据保存成功"或错误原因 '400': description: 请求参数错误 content: application/json: schema: type: object properties: message: type: string description: 错误信息,如缺少必填参数等 '500': description: 服务器内部错误 content: application/json: schema: type: object properties: message: type: string description: 错误信息,如数据库连接失败等
-
测试工具:点击测试,如果测试通过,返回“数据保存成功”,如果失败,可以检查下防火墙是否有限制。注意:如果修改服务后,需要刷新这个页面后再点击“测试”进行测试;
-
配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。
关注微信公众号【红岸解码室】,发送“天气预报”,获取天气预报DSL文件!