Ubantu下实现Dify自定义构建插件连接supset

本文采用的技术:Python:编写API

一、介绍一些名词

1. Dify中的自定义工具

在 Dify 工具中,创建自定义工具指的是用户依据自身特定需求,打造个性化功能模块并集成到 Dify 平台,以此拓展 AI 应用能力。

举个例子:企业里的数据一般涉及保密,技术人员利用编程语言(如 Python)编写代码,调用库存管理系统的 API,获取商品的库存数据。

在 Dify 中自定义一个插件来实现连接 Superset 报表,意味着通过编写特定的代码逻辑,在 Dify 平台与 Superset 之间建立起数据交互的桥梁。

2. Dify和Superset起到的作用

Dify能够从 Superset 报表中提取所需的数据,并将其转换为 Dify 能够理解和处理的格式。这样,Dify 就可以根据用户的需求,对这些数据进行进一步的分析、整合或呈现,为用户提供更有价值的信息。通过这种连接,用户可以在 Dify 的应用环境中,方便地查询和使用 Superset 报表中的数据,而无需在不同的系统之间切换。

二、实现连接

1. 编写第三方接口(Fastapi和Python)

做法:

询问deepseek(比如这边需要获取superset中的一个DashBoard界面)

向Deepseek询问:请编写第三方服务接口代码,用于连接dify和superset。 superset的一些网址:1、登录:http://localhost:8088/login (admin/admin) dify可以访问的dashboard:XXXX

import os
from fastapi import FastAPI, HTTPException
import requests
from pydantic import BaseModel
from typing import Optional

app = FastAPI()

# 配置环境变量
SUPERSET_URL = os.getenv("SUPERSET_URL", "http://localhost:8088")
SUPERSET_USERNAME = os.getenv("SUPERSET_USERNAME", "admin")
SUPERSET_PASSWORD = os.getenv("SUPERSET_PASSWORD", "admin")

# 全局缓存访问令牌
ACCESS_TOKEN = None

class DashboardRequest(BaseModel):
    dashboard_id: int
    filters: Optional[dict] = None  # 可选的过滤器参数

def get_access_token():
    """获取 Superset 访问令牌"""
    global ACCESS_TOKEN
    login_url = f"{SUPERSET_URL}/api/v1/security/login"
    payload = {
        "username": SUPERSET_USERNAME,
        "password": SUPERSET_PASSWORD,
        "provider": "db"
    }
    try:
        response = requests.post(login_url, json=payload)
        response.raise_for_status()
        ACCESS_TOKEN = response.json().get("access_token")
        return ACCESS_TOKEN
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Superset 认证失败: {str(e)}")

def fetch_dashboard_data(dashboard_id: int, filters: Optional[dict] = None):
    """获取仪表盘数据"""
    global ACCESS_TOKEN
    if not ACCESS_TOKEN:
        get_access_token()
    
    headers = {
        "Authorization": f"Bearer {ACCESS_TOKEN}",
        "Content-Type": "application/json"
    }
    
    # 获取仪表盘元数据
    dashboard_url = f"{SUPERSET_URL}/api/v1/dashboard/{dashboard_id}"
    try:
        response = requests.get(dashboard_url, headers=headers)
        response.raise_for_status()
        dashboard_meta = response.json()
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 401:  # Token 过期
            get_access_token()
            headers["Authorization"] = f"Bearer {ACCESS_TOKEN}"
            response = requests.get(dashboard_url, headers=headers)
            response.raise_for_status()
            dashboard_meta = response.json()
        else:
            raise
    
    # 获取图表数据
    chart_data = []
    for chart in dashboard_meta.get("charts", []):
        chart_id = chart["id"]
        data_url = f"{SUPERSET_URL}/api/v1/chart/{chart_id}/data/"
        params = {"form_data": {"filters": filters}} if filters else None
        try:
            response = requests.get(data_url, headers=headers, params=params)
            response.raise_for_status()
            chart_data.append({
                "chart_id": chart_id,
                "data": response.json()
            })
        except Exception as e:
            chart_data.append({
                "chart_id": chart_id,
                "error": str(e)
            })
    
    return {
        "dashboard_id": dashboard_id,
        "metadata": dashboard_meta,
        "charts": chart_data
    }

@app.post("/get-dashboard")
async def get_dashboard(request: DashboardRequest):
    """供 Dify 调用的接口"""
    try:
        data = fetch_dashboard_data(request.dashboard_id, request.filters)
        return {
            "status": "success",
            "data": data,
            "dashboard_url": f"{SUPERSET_URL}/superset/dashboard/{request.dashboard_id}/"
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=5000)

2.  生成curl 命令行代码

询问deepseek:以上代码我需要使用postman 测试,请将以上代码使用CURL 命令实现客户端测试,请给出代码

如下,deepseek会给出很多的示例,选择一个即可:

# 测试不带过滤器的请求
curl -X POST "http://localhost:5000/get-dashboard" \
-H "Content-Type: application/json" \
-d '{"dashboard_id": 1}'

# 测试带过滤器的请求
curl -X POST "http://localhost:5000/get-dashboard" \
-H "Content-Type: application/json" \
-d '{"dashboard_id": 1, "filters": {"country": "China"}}'

3. 安装postman

下载连接:Download Postman | Get Started for Free

下载好后,操作如下

(1)解压安装包

tar -xvf postman.tar.gz

(2)创建一个符号链接以便可以直接在终端中运行Postman:

sudo ln -s /Postman/Postman /usr/local/bin/postman

(3)创建一个创建一个桌面启动器图标

sudo nano /usr/share/applications/postman.desktop

(5)写入一下内容

[Desktop Entry]
Encoding=UTF-8
Name=Postman
Exec=postman
Icon=/opt/Postman/app/resources/app/assets/icon.png
Terminal=false
Type=Application
Categories=Development;

(5)按 Ctrl + X 保存并退出nano编辑器。

现在,您可以在应用程序菜单中找到并打开Postman,或者在终端中运行 postman 命令启动Postman。

4. 将curl命令导入postman

curl -X POST "http://localhost:5000/get-dashboard" \
-H "Content-Type: application/json" \
-d '{"dashboard_id": 1}'

点击Send(确保python那边在运行),如下图所示,表示连接成功

5.生成OpenAPI-Swagger规范

回到Dify,将规范复制出来。

询问deepseek:请把curl请求命令转成openapi 3.1.0 版本的json schema,不需要包含response信息。(复制刚刚的curl命令和规范)

将deepseek给的代码复制到如下中

输入后,下方选项框会出现测试,点击进行测试

Python端显示200 OK,即表示连接成功,获取到数据了。

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

参考:https://www.toutiao.com/article/7393512798459806243/?wid=1746757509821

Linux系统:Ubuntu上安装postman的详细教程_ubuntu安装postman-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值