Dify 中的讯飞星火平台工具源码分析

本文主要对 Dify 中的讯飞星火平台工具 spark 进行了源码分析,该工具可根据用户的输入生成图片,由讯飞星火提供图片生成 API。通过本文学习可自行实现将第三方 API 封装为 Dify 中工具的能力。

源码位置:dify-0.6.14\api\core\tools\provider\builtin\spark

一. spark.yaml(工具供应商 yaml)

这段代码是一个配置文件,用于设置一个平台工具的认证信息。这个平台工具的名称是 “Spark”,由一个名为 Onelevenvy 的作者创建。下面逐行解释这段代码的每个部分:

identity:author: Onelevenvyname: sparklabel:en_US: Sparkzh_Hans: 讯飞星火pt_BR: Sparkdescription:en_US: Spark Platform Toolkitzh_Hans: 讯飞星火平台工具pt_BR: Pacote de Ferramentas da Plataforma Sparkicon: icon.svgtags:- image

1.identity定义平台工具的基本信息

  • author: 工具的作者是 Onelevenvy。

  • name: 工具的名称是 “spark”。

  • label: 工具的标签在不同语言中的翻译。

    • en_US: 英文标签为 “Spark”。
    • zh_Hans: 简体中文标签为 “讯飞星火”。
    • pt_BR: 葡萄牙语标签为 “Spark”。
  • description: 工具的描述在不同语言中的翻译。

    • en_US: 英文描述为 “Spark Platform Toolkit”。
    • zh_Hans: 简体中文描述为 “讯飞星火平台工具”。
    • pt_BR: 葡萄牙语描述为 “Pacote de Ferramentas da Plataforma Spark”。
  • icon: 图标文件的名称是 “icon.svg”。

  • tags: 标签信息,这里仅包含一个标签 “image”,表明这个工具与图像相关。

credentials_for_provider:APPID:type: secret-inputrequired: truelabel:en_US: Spark APPIDzh_Hans: APPIDpt_BR: Spark APPIDhelp:en_US: Please input your APPIDzh_Hans: 请输入你的 APPIDpt_BR: Please input your APPIDplaceholder:en_US: Please input your APPIDzh_Hans: 请输入你的 APPIDpt_BR: Please input your APPID

其中,credentials_for_provider定义用于认证的必要凭证。

2.credentials_for_provider - APPID

  • type: 输入类型为 “secret-input”,这意味着它是一个需要保密的输入字段。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APPID”。
    • zh_Hans: 简体中文标签为 “APPID”。
    • pt_BR: 葡萄牙语标签为 “Spark APPID”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your APPID”。
    • zh_Hans: 简体中文提示为 “请输入你的 APPID”。
    • pt_BR: 葡萄牙语提示为 “Please input your APPID”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your APPID”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APPID”。
    • pt_BR: 葡萄牙语占位符为 “Please input your APPID”。
APISecret:type: secret-inputrequired: truelabel:en_US: Spark APISecretzh_Hans: APISecretpt_BR: Spark APISecrethelp:en_US: Please input your Spark APISecretzh_Hans: 请输入你的 APISecretpt_BR: Please input your Spark APISecretplaceholder:en_US: Please input your Spark APISecretzh_Hans: 请输入你的 APISecretpt_BR: Please input your Spark APISecret

3.credentials_for_provider - APISecret

  • type: 输入类型为 “secret-input”。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APISecret”。
    • zh_Hans: 简体中文标签为 “APISecret”。
    • pt_BR: 葡萄牙语标签为 “Spark APISecret”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your Spark APISecret”。
    • zh_Hans: 简体中文提示为 “请输入你的 APISecret”。
    • pt_BR: 葡萄牙语提示为 “Please input your Spark APISecret”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your Spark APISecret”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APISecret”。
    • pt_BR: 葡萄牙语占位符为 “Please input your Spark APISecret”。
APIKey:type: secret-inputrequired: truelabel:en_US: Spark APIKeyzh_Hans: APIKeypt_BR: Spark APIKeyhelp:en_US: Please input your Spark APIKeyzh_Hans: 请输入你的 APIKeypt_BR: Please input your Spark APIKeyplaceholder:en_US: Please input your Spark APIKeyzh_Hans: 请输入你的 APIKeypt_BR: Please input Spark APIKeyurl: https://console.xfyun.cn/services

4.credentials_for_provider - APIKey

  • type: 输入类型为 “secret-input”。

  • required: 这个字段是必填的。

  • label: 在不同语言中的标签。

    • en_US: 英文标签为 “Spark APIKey”。
    • zh_Hans: 简体中文标签为 “APIKey”。
    • pt_BR: 葡萄牙语标签为 “Spark APIKey”。
  • help: 提示信息,在不同语言中的翻译。

    • en_US: 英文提示为 “Please input your Spark APIKey”。
    • zh_Hans: 简体中文提示为 “请输入你的 APIKey”。
    • pt_BR: 葡萄牙语提示为 “Please input your Spark APIKey”。
  • placeholder: 占位符信息,在不同语言中的翻译。

    • en_US: 英文占位符为 “Please input your Spark APIKey”。
    • zh_Hans: 简体中文占位符为 “请输入你的 APIKey”。
    • pt_BR: 葡萄牙语占位符为 “Please input Spark APIKey”。
  • url: 提供了一个 URL 链接,指向用于获取或管理这些凭证的控制台页面。

总结:这段配置文件定义了一个名为 Spark 的平台工具的各种信息和认证所需的凭证。

二. spark.py(工具供应商代码)

在供应商模块下创建一个供应商类,用于实现供应商的凭据验证逻辑,如果凭据验证失败,将会抛出 ToolProviderCredentialValidationError 异常。

class SparkProvider(BuiltinToolProviderController):def _validate_credentials(self, credentials: dict) -> None:try:if "APPID" not in credentials or not credentials.get("APPID"):raise ToolProviderCredentialValidationError("APPID is required.")if "APISecret" not in credentials or not credentials.get("APISecret"):raise ToolProviderCredentialValidationError("APISecret is required.")if "APIKey" not in credentials or not credentials.get("APIKey"):raise ToolProviderCredentialValidationError("APIKey is required.")appid = credentials.get("APPID")apisecret = credentials.get("APISecret")apikey = credentials.get("APIKey")prompt = "a cute black dog"try:response = spark_response(prompt, appid, apikey, apisecret)data = json.loads(response)code = data["header"]["code"]if code == 0:#  0 success,passelse:raise ToolProviderCredentialValidationError("image generate error, code:{}".format(code))except Exception as e:raise ToolProviderCredentialValidationError("APPID APISecret APIKey is invalid. {}".format(e))except Exception as e:raise ToolProviderCredentialValidationError(str(e))

三.spark_img_generation.yaml(工具 yaml)

1.Identity 部分

这个部分定义了工具或服务的基本身份信息。

identity:name: spark_img_generationauthor: Onelevenvylabel:en_US: Spark Image Generationzh_Hans: 图片生成pt_BR: Geração de imagens Sparkicon: icon.svgdescription:en_US: Spark Image Generationzh_Hans: 图片生成pt_BR: Geração de imagens Spark
  • name: 工具的唯一标识符,是 spark_img_generation

  • author: 工具的创建者或作者,是 Onelevenvy

  • label: 工具在不同语言中的显示名称。

    • en_US: 在英语中是 Spark Image Generation(“Spark 图像生成”)。
    • zh_Hans: 在简体中文中是 图片生成(意思是“图像生成”)。
    • pt_BR: 在葡萄牙语(巴西)中是 Geração de imagens Spark(意思是“Spark 图像生成”)。
  • icon: 工具关联的图标,指定为 icon.svg

  • description: 工具的简要描述,支持多种语言。

    • en_US: 在英语中描述为 Spark Image Generation(与标签相同)。
    • zh_Hans: 在简体中文中是 图片生成(与标签相同)。
    • pt_BR: 在葡萄牙语(巴西)中是 Geração de imagens Spark(与标签相同)。

2.Description 部分

提供有关工具的详细信息,包括对人类用户和语言模型的描述。

description:human:en_US: Generate images based on user input, with image generation APIprovided by Sparkzh_Hans: 根据用户的输入生成图片,由讯飞星火提供图片生成apipt_BR: Gerar imagens com base na entrada do usuário, com API de geraçãode imagem fornecida pela Sparkllm: spark_img_generation is a tool used to generate images from text
  • human: 这个子部分描述了从用户的角度如何使用这个工具。

    • en_US: 在英语中,描述为"根据用户输入生成图像,使用 Spark 提供的图像生成 API"。
    • zh_Hans: 在简体中文中是"根据用户的输入生成图片,由讯飞星火提供图片生成 api"。
    • pt_BR: 在葡萄牙语(巴西)中是"根据用户输入生成图像,使用 Spark 提供的图像生成 API"。
  • llm: 这个子部分为语言模型提供描述。

    • 说明 spark_img_generation 是一个从文本生成图像的工具。

3.Parameters 部分

parameters:- name: prompttype: stringrequired: truelabel:en_US: Promptzh_Hans: 提示词pt_BR: Prompthuman_description:en_US: Image promptzh_Hans: 图像提示词pt_BR: Image promptllm_description: Image prompt of spark_img_generation tooll, you shoulddescribe the image you want to generate as a list of words as possibleas detailedform: llm
  • parameters: 这个部分定义了工具接受的参数。
    • name: 参数的名称,是 prompt
    • type: 参数的类型,是 string(字符串)。
    • required: 指示该参数是否是必需的。在这里是 true,意味着 prompt 是必需的。
    • label: 参数的显示标签,支持多种语言。
      • en_US: 在英语中是 Prompt(“提示词”)。
      • zh_Hans: 在简体中文中是 提示词(意思是“提示”)。
      • pt_BR: 在葡萄牙语(巴西)中是 Prompt(与英语相同)。
    • human_description: 为人类用户提供的参数描述。
      • en_US: 在英语中描述为“Image prompt”(图像提示词)。
      • zh_Hans: 在简体中文中是 图像提示词(描述图像的提示)。
      • pt_BR: 在葡萄牙语(巴西)中是 Image prompt(与英语相同)。
    • llm_description: 为语言模型提供的参数描述。
      • 说明 prompt 是生成图像的输入。描述应尽可能详细,以便生成所需的图像。
    • form: 指定期望的输入形式,这里是 llm(可能指语言模型的输入)。form 表单类型,目前支持 llm、form 两种类型,分别对应 Agent 自行推理和前端填写。

四.spark_img_generation.py(工具代码)

工具的整体逻辑都在 _invoke 方法中,这个方法接收两个参数:user_idtool_paramters,分别表示用户 ID 和工具参数。

1.spark_response()方法

主要是发起 requests.post 请求,返回图像内容:

def spark_response(text, appid, apikey, apisecret):host = "http://spark-api.cn-huabei-1.xf-yun.com/v2.1/tti"url = assemble_ws_auth_url(host, method="POST", api_key=apikey, api_secret=apisecret)content = get_body(appid, text)response = requests.post(url, json=content, headers={"content-type": "application/json"}).textreturn response

返回图像具体内容:

2.img_generation()方法

主要是返回图像具体的内容:

def img_generation(self, prompt):response = spark_response(text=prompt,appid=self.runtime.credentials.get("APPID"),apikey=self.runtime.credentials.get("APIKey"),apisecret=self.runtime.credentials.get("APISecret"),)data = json.loads(response)code = data["header"]["code"]if code != 0:return self.create_text_message(f"error: {code}, {data}")else:text = data["payload"]["choices"]["text"]image_content = text[0]image_base = image_content["content"]json_data = {"base64_image": image_base}return [json_data]

3._invoke()方法

对图像内容 image[“base64_image”]进行 b64decode 解码,创建 create_blob_message:

def _invoke(self,user_id: str,tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:<em>"""</em>
<em>    invoke tools</em>
<em>    """</em>......prompt = tool_parameters.get("prompt", "")if not prompt:return self.create_text_message("Please input prompt")res = self.img_generation(prompt)result = []for image in res:result.append(self.create_blob_message(blob=b64decode(image["base64_image"]),meta={"mime_type": "image/png"},save_as=self.VARIABLE_KEY.IMAGE.value,))return result

原始图像内容进行 b64decode 解码后的图像内容:

说明:生成的图像保存在 dify-0.6.14\api\storage\tools\095756e3-1af6-435f-bafb-82c05264f64d 目录。

参考文献

[1] 快速接入工具:https://docs.dify.ai/v/zh-hans/guides/gong-ju/quick-tool-integration

[2] 高级接入工具:https://docs.dify.ai/v/zh-hans/guides/gong-ju/advanced-tool-integration

[3] 工具配置:https://docs.dify.ai/v/zh-hans/guides/gong-ju/tool-configuration

[4] Dify 中的工具:https://z0yrmerhgi8.feishu.cn/wiki/L0WWwUllrirwNvksBMjcOCmanuh

NLP工程化(星球号)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426732.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出厂非澎湃OS手机解BL锁

脚本作者&#xff1a;酷安mlgmxyysd 脚本项目链接&#xff1a;https://github.com/MlgmXyysd/Xiaomi-HyperOS-BootLoader-Bypass/ 参考 B站作者&#xff1a;蓝空穹 https://www.bilibili.com/read/cv33210124/ 其他参考&#xff1a;云墨清风、水墨青竹、Magisk中文网 决定解BL…

django学习入门系列之第十点《A 案例: 员工管理系统10》

文章目录 12 管理员操作12.4 密码加密12.5 获取对象&#xff08;防止id错误--编辑界面等&#xff09;12.6 编辑管理员12.7 重置密码 往期回顾 12 管理员操作 12.4 密码加密 密码不应该以明文的方式直接存储到数据库&#xff0c;应该加密才放进去 定义一个md5的方法&#xff…

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中&#xff0c;遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…

飞睿智能UWB BLE Tag蓝牙防丢器模块,APP测距定位一键绑定,安全守护每一刻

我们总在不经意间与生活中的小物件擦肩而过——钥匙遗忘在咖啡厅的角落&#xff0c;钱包遗失在拥挤的地铁&#xff0c;甚至孩子的书包在人群中悄然消失……每一次的失而复得都是幸运的眷顾&#xff0c;但更多的是遗憾与不便。今天&#xff0c;就让我带你走进一个智能守护的新世…

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…

【算法】遗传算法

一、引言 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种模拟生物进化过程的启发式搜索算法&#xff0c;它通过模拟自然选择、遗传、交叉和突变等生物学机制来优化问题的解决方案。遗传算法因其通用性、高效性和鲁棒性&#xff0c;在多个领域中得到了广泛应用&a…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…

C语言 | Leetcode C语言题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; int numberOfArithmeticSlices(int* nums, int numsSize) {if (numsSize 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for (int i 2; i < numsSize; i…

Java | Leetcode Java题解之第415题字符串相加

题目&#xff1a; 题解&#xff1a; class Solution {public String addStrings(String num1, String num2) {int i num1.length() - 1, j num2.length() - 1, add 0;StringBuffer ans new StringBuffer();while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? n…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP服务端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;服务端包链接&#xff1a;https://download.csdn.net/download/AirIT/89747026&#xff09; 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;客户端包链接&#xff1a;https://downloa…

keil里sprintf的用法

代码&#xff1a; #include<stdio.h> int main(void) {float i-123.45;char zifu[10];sprintf(zifu,"%f",i);while(1);return 0; } 仿真结果 代码&#xff1a; #include<stdio.h> int main(void) {float i123.45;char zifu[10];sprintf(zifu,"%f…

【网络】传输层协议TCP

TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793定义。TCP在IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;网络层上提供…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…

Flask-JWT-Extended登录验证

1. 介绍 """安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&…

vue之 package.json和package-lock.json

一、package.json 定义了当前项目所需要引用的各个模块&#xff0c;可以手工修改配置&#xff0c;也可以删除后&#xff0c;使用npm init命令重新自动生成。 但是该文件只锁定大版本号&#xff0c;也就是版本号的第一位&#xff0c;所以你会发现两个文件中同一个包的版本号不一…

项目实现:云备份②(文件操作、Json等工具类的实现)

云备份 前言文件操作实用工具类设计文件属性的获取文件的读写操作文件压缩与解压缩的实现文件目录操作 Json 实用工具类设计编译优化 前言 如果有老铁不知道当前项目实现的功能是什么的话&#xff0c;可以先移步这篇文章内容&#xff1a; 云备份项目的介绍 其中介绍了云备份项…

[数据集][目标检测]无人机飞鸟检测数据集VOC+YOLO格式6647张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6647 标注数量(xml文件个数)&#xff1a;6647 标注数量(txt文件个数)&#xff1a;6647 标注…

数据结构与算法——顺序表期末复习五大经典题型

目录 一&#xff1a;顺序表-移除元素 二&#xff1a;顺序表-删除有序数组中的重复项 三&#xff1a;顺序表-合并两个有序数组 四&#xff1a;顺序表-旋转数组 五&#xff1a;顺序表-数组形式的整数加法 一&#xff1a;顺序表-移除元素 题型链接&#xff1a;27. 移除元素 -…

npm切换为淘宝镜像源

要切换 npm 的镜像源&#xff0c;您可以使用以下几种方法&#xff1a; 前言 然而&#xff0c;由于众所周知的网络环境问题&#xff0c;直接使用npm官方源下载依赖包时&#xff0c;常常会遇到速度慢甚至下载失败的情况。因此&#xff0c;使用更稳定、更快速的国内镜像源就显得尤…

【Python】探索Magenta:音乐与艺术的机器智能创作

下班了&#xff0c;今天的苦就先吃到这里。 在人工智能的浪潮中&#xff0c;机器学习技术正逐渐渗透到艺术创作的各个领域。今天&#xff0c;我们来探索一个特别的项目——Magenta&#xff0c;它是由Google Brain团队发起的&#xff0c;旨在使用机器智能生成音乐和艺术。这个项…