本文采用的技术: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
479

被折叠的 条评论
为什么被折叠?



