环境:dify 14.2 docker版本;

模型:glm-4-flash;

工具:sql_save_post;

一、背景

Dify 的工作流模式能够为我们带来诸多便利。然而,若要将其运用于生产力领域,使其从玩具转变为工具,仍有许多工作需要完成。例如,将通过 Dify 工作流生成的内容自动写入数据库。

二、实现思路

我们以向 MySQL 数据库写入工作流生成内容为例。采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。在 Dify 上创建自定义工具,并在后续的工作流中调用此工具,以实现生成的内容自动写入 MySQL 数据库。

此外,还有一种方法,通过 Dify 自带的 HTTP 请求工具发送 POST 请求接口。但是,在实际使用过程中,我发现当生成一些特殊字符时,会出现请求失败的情况。而自定义工具的形式则更加稳定。因此,建议大家采用自定义工具的方式。

三、实现步骤

  1. 编写服务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)
    
  2. 启动sql_save_post服务:

    python sql_save_post.py
    
  3. 编写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: 错误信息,如数据库连接失败等
    
  4. 测试工具:点击测试,如果测试通过,返回“数据保存成功”,如果失败,可以检查下防火墙是否有限制。注意:如果修改服务后,需要刷新这个页面后再点击“测试”进行测试;

  5. 配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。

关注微信公众号【红岸解码室】,发送“天气预报”,获取天气预报DSL文件!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐