0%

mtools-dify_platform

项目结构
image-20250227035929819
部署到dify平台的步骤
1.tools.yaml文件是整个工具类,例如videodeal工具类的dify配置文件
image-20250227035937326
2.text_to_video_con.yaml是单项功能例如text2video功能的dify配置文件
image-20250227035945208

注意这里text_to_video_con.py只是起名一样,provider中的con是服务调用,具体内容后面介绍。

3.dify平台对yaml配置文件的说明文档如下,options配置参考上图,注意部分参数只能使用固定的几个,比如参数类型、表单类型、required之类的参数。
image-20250227035951820
4.配置manifest.yaml(非必须),其中name需要小写
image-20250227035958114
5.配置和dify平台连接的key、host、port
6.修改provider文件夹中tools/xxxcon.py的内容

这里invoke函数是dify平台流程调用后会调用的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import logging
import httpx
from typing import Generator, Any
from dify_plugin import Tool
from dify_plugin.entities.tool import ToolInvokeMessage

logger = logging.getLogger(__name__)

class TextToVideoTool(Tool):
def _invoke(self, tool_parameters: dict[str, Any]) -> ToolInvokeMessage:
print(tool_parameters)
data = {
"content": tool_parameters["content"],
# "url": tool_parameters["url"],
}

# 发送请求
with (httpx.Client(timeout=240) as client):
print(self.runtime.credentials['DA_TOOLS_SERVICE_URL'])
# print(data)
response = client.post('http://' + self.runtime.credentials['DA_TOOLS_SERVICE_URL'] + '/md_processing/md_to_pdf', json=data)
if response.status_code == 200:
if "application/json" in response.headers.get("Content-Type", ""):
try:
json_response = response.json()
if json_response.get('code') == 0:
# 如果 JSON 中的 code 为 0,表示成功
print("JSON response:", json_response)
return self.create_json_message(json_response)
else:
print("Error code in JSON response:", json_response.get('code'))
except ValueError as e:
print("Error parsing JSON:", e)
# 如果响应是 PDF 或二进制文件
elif "pdf" in response.headers.get("Content-Type", "") or "octet-stream" in response.headers.get("Content-Type", ""):
# 创建一个生成器,逐块返回文件流
file_blob = b"" # 初始化一个空的 bytes 对象
for chunk in response.iter_bytes(chunk_size=1024 * 1024): # 每次读取1MB
file_blob += chunk # 将文件流逐块拼接
response.close() # 确保关闭响应流
# print(file_blob)
# 创建文件元数据
meta = {
"mime_type": "application/pdf"
}
# 返回文件的原始数据
yield self.create_text_message("转换完成")
yield self.create_blob_message(blob=file_blob, meta=meta)
else:
raise ValueError("返回的内容类型不是pdf")
else:
raise ValueError(f"访问失败,状态码:{response.status_code}")

使用data接收数据,data中内容需要和dify平台一致,dify平台的参数又和yaml中设置的参数相关

然后使用接收的数据请求你做好的功能,记得加上http://前缀

接收到返回值,注意其是json、pdf、doc或者其他类型,就需要调用对应的create_blob_message(文件)、create_text_message(文本)

7.运行provider项目

进入provider文件夹,python main.py运行,如果yaml文件格式正确、env文件配置的key、host、port正确,则会连接成功出现以下字段

image-20250307075504626

dify平台工具库会出现你写的功能,其名字和你配置的tools.yaml文件中的内容一致。

点击工具集,会出现你配置的功能,和tools.yaml中配置的tools一致。

点击授权,配置你的服务,就是127.0.0.1:15000,进入tools_service目录运行python app.py运行。(这个目录中的结构和内容就是之前写的那个)。

8.创建dify平台的工作流

添加节点或者更改节点

根据流程连线

点击MD转PDF节点,会出现输入变量,/即可选择上一个节点传过来的变量,query即为文本框输入的内容

点击回复节点,/即可选择回复,只有/text和/files,需要对应前面写的

create_blob_message(文件)、create_text_message(文本)

9.调试使用

自行调式前面是不是哪里有问题,返回值配置参考https://docs.dify.ai/zh-hans/plugins/schema-definition/tool

其他内容也可以参考这个平台的文档,记得多刷新,多重新配,因为可能你改了你的yaml配置,但是dify平台那边还没有改过来,就好像改了代码但没有什么反应,实际上不是代码问题,是平台还没有同步。