项目结构
部署到dify平台的步骤

2.text_to_video_con.yaml是单项功能例如text2video功能的dify配置文件

注意这里text_to_video_con.py只是起名一样,provider中的con是服务调用,具体内容后面介绍。
3.dify平台对yaml配置文件的说明文档如下,options配置参考上图,注意部分参数只能使用固定的几个,比如参数类型、表单类型、required之类的参数。

4.配置manifest.yaml(非必须),其中name需要小写

5.配置和dify平台连接的key、host、port

这里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正确,则会连接成功出现以下字段

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平台那边还没有改过来,就好像改了代码但没有什么反应,实际上不是代码问题,是平台还没有同步。
